ジェネリック型とリフレクション

ジェネリック型の情報は、他の型の情報と同じ方法で取得します。つまり、ジェネリック型を表す Type オブジェクトをチェックすることによって取得します。原則の違いは、ジェネリック型の場合、ジェネリック型パラメータを表す Type オブジェクトのリストを保持することです。このセクションでは、まず、ジェネリック型をチェックする手順を示します。

ジェネリック型の定義の型パラメータに型引数をバインドすることにより、構築された型を表す Type オブジェクトを作成できます。2 番目の手順でこの方法を示します。

方法 : リフレクションを使用してジェネリック型をチェックおよびインスタンス化する

自作のフレームワーク中でやりたかったことが書いてあるのでメモ。後で読みたい。

やっぱり、WCFとかWFといった話より、こういう言語仕様の話の方が好きな自分を実感。

追記:

WCFでデータを検索するサービスは検索したい情報毎に作る必要があるが、検索エンジンは一つにしておきたかったので、そこで利用してみた。

思ったように事が運んでよかった。

Share
カテゴリー: .NET

.NET関連で困った時に調べる順番

.NET関連で困った時、昔は

1.Google

2.MSDN

という順番だったのだが結局正しい情報として検索結果の中からMSDを選択することが多かったので、最近は

1.MSDN

2.Microsoftの開発者向け情報サイト(http://asp.net等)

2.Google

という順番が多い。

そして、大抵1番で終了するパターンが多い。

あえてGoogleを使うときもMSDNの中を検索する為に利用する事が多い。

ナレッジベースなんかはGoogleでKB{番号}で検索した方が明らかに早いし。

それだけに、MSDNの重さとか、使いやすさがもうちょっと、どうにかならんもんかなと思う。

Share
カテゴリー: .NET

パズル:nまでの整数を二つの組に分けて合計した結果が同じだった2番目と3番目を出力する

問題:1からnまでの整数を二つの組に分けて合計した結果が同じだった2番目と3番目を出力する。

public void nまでの整数を二つの組に分けて合計した結果が同じだった2番目と3番目()
{
//Enumerable.Select().Sum()は使わない方向で
Func<int, int, int> xからyまでの計 = (int x, int y) => ((x + y) * ((y - x + 1) / 2)) + (((y + x) / 2) * ((y - x + 1) % 2));
Func<int, bool> nまでの数字を二つの組に分けて合計した結果が同じ = (int n) => Enumerable.Range(n / 2, n - (n / 2))
.Where(分ける数字 => xからyまでの計(1, 分ける数字) ==
xからyまでの計(分ける数字 + 1, n))
.Select(x => x).Count() > 0;
int[] 該当するnのリスト = Enumerable.Range(2, int.MaxValue - 2).Where(n => nまでの数字を二つの組に分けて合計した結果が同じ(n))
.Select(n => n)
.Take(3).ToArray();
Console.WriteLine("no2:{0},no3:{1}", 該当するnのリスト[1], 該当するnのリスト[2]);
}
Share

超今更な話だけどGenericの型パラメータの制約は便利だ

最近、Genericを利用したクラスを作成する機会があった。

もともと、以下のような感じのGenericを利用していないクラスがあったのをGenericに対応した。

public abstract class ほにゃAbstract
{
public ほにゃAbstract()
{
}
public abstract DataTable TableData
{get;}
}
public class ふが :ほにゃabstract
{
private 型のついたテーブル型 _data = new 型のついたテーブル型();
public override DataTable TableData
{
get
{
return _data;
}
}
}

というクラスがあったとして、Dataプロパティを利用するときは、常にDataTable型なので、型付DataSetで定義したテーブルを返す時は

ふが ふがインスタンス = インスタンス作成();
型のついたテーブル型 データ = (型のついたテーブル型)ふがインスタンス.TableData;

といった感じにいちいちキャストする必要があったが

public abstract class ほにゃAbstract<T> where T:DataTable,new()
{
public abstract ほにゃAbstract()
{
}
private T _data = new T();
public abstract T TableData
{
get
{
return _data;
}
}
}
public class ふが :ほにゃabstract<型のついたテーブル型>
{
}

とすることで、

ふが ふがインスタンス = インスタンス作成();
型のついたテーブル型 データ = ふがインスタンス.TableData;

とキャストしなくて良くなった。

ここで、重要だと思ったのが、

public abstract class ほにゃAbstract<T> where T:DataTable,new()

のwhere以降の部分で、Tに設定できる型の条件を指定できる。

T:DataTable

で、DataTableを基本型に持つクラスのみ指定可能なので、DataTableを継承した型である事という条件がクリアできる。

次に

new()

とつけることで、

private T _data = new T();

といったように抽象クラス側でインスタンスの生成ができるようになったので、いちいちサブクラス側でメンバを設定する必要が無くなった。

今更だし、凄い簡単な話なんだけど、便利だと思った。

そういえば、MSDNライブラリの型パラメータの制約ページの構文を説明している箇所で

http://msdn.microsoft.com/ja-jp/library/d5x73970.aspx

where T:struct

where T:class

のままで良いのに、

where T:構造体

where T:クラス

になっていた。

翻訳されすぎ。

Share

ActiveReports For .NET2.0と3.0の共存について

全く問題なく共存できるんだけど、ActiveRpoerts For .NET 3.0をインストール後にVisualStudio2003で作成したActiveRpoerts For .NET 2.0を利用したプロジェクトのActiveReports.Webだけなぜか参照先が3.0になってしまう。

参照設定をやり直せばすぐ解決する問題ですが、ビルドしようとして、「なんで?」となったので書いておきます。

Share
カテゴリー: .NET

Base64だったりQuoted-printableだったり

smtpClientクラスとMailMessageクラスでメールを送信する時のContent-Transfer-Encodingとsubjectのエンコードは、

UTF-8の時、Base64なんだけど、

ISO-2022-JPの時は、quoted-printableになる。

せっかく、2.0からSubjectEncodingとBodyEncodingで文字コードを選択できるようになったのに、コーディングで回避しないとISO-2022-JPでBase64という事ができないのはちょっと勿体ない。

たいした手間ではないのだけれど、勿体ない。

こっちも指定出来ればよいのに。

Share
カテゴリー: .NET

VBのif文におけるAndとOrはいらない

AndAlsoとOrElseだけで良いのに。

というか、

AndAlsoとOrElseがいらなくて、AndとOrの挙動をAndAlsoとOrElseと同じにしてしまえばよいのに。

VBでコードを書いていてif文でAndとOrを利用したことが一度も無い。

コードレビューすると、特にいみなくAndとOrとAndAlsoとOrElseが混在しているのがうざいので、最初から無ければ良いのに。(規約には、AndAlsoとOrElseでよろしく。って書いてあるので・・・。)

AndとOrがショートサーキットになって困るのは、ショートサーキットじゃないことによる副作用を期待しているようなif文を含んだ「くそーす」だけなのでは。

Share
カテゴリー: .NET

戯れにナベアツ問題の新しい応用編をLINQで作ってみた

くだらなくてすいません。

ナベアツのいつものネタの応用編に新しいものが追加されていた。

3の倍数と3の数字がつくときにアホになって、

5の倍数のとき犬っぽくなっていた。

「ナベアツ」の検索結果 – NAL-6295の舌先三寸

5の倍数のとき犬っぽくなりますが、ついでに末尾が5のときは、ゴフッと吼えるようになっています。

Dim 読み上げリスト = From 今の数字 In Enumerable.Range(1, 40) _
Let アホになる = (今の数字 Mod 3) = 0 OrElse 今の数字.ToString().IndexOf("3") >= 0 _
Let 犬になる = (今の数字 Mod 5) = 0 _
Select _
IIf(アホになる, "アホ", "") & _
IIf(犬になる, IIf((今の数字 Mod 10) = 5, "ゴフッ", "ワオーン"), "") & _
IIf(アホになる OrElse 犬になる, "", 今の数字.ToString())
For Each 読み上げる値 In 読み上げリスト
Console.WriteLine(読み上げる値)
Next
Share
カテゴリー: .NET

BlogEngine.NETのソースを見たりデバッグしたりしてトラックバック送信についてわかったこと

アンカータグが指定しているURLがhttp://で始まらない場合は、トラックバックの対象にならない。

ローカルに対してのトラックバックは対象外になるようになっているっぽい。

また、

URLが対象になったとしても、そのあと、実際にそのURLの先のページをゲットして、

rdf内の

trackback:ping=”url”

を見つけて新しくtrackbackUrlを取得しているようで、その結果何も取得できないとやはりトラックバックが送信されず、pingbackが送信されるようになっている。

そして、受信に関して言えばblogengine.netのparmalinkはそんな情報を吐いていないので、BlogEngine.NET同士はpingbackになるのかな。

ついでに、blog_name,title,urlあたりが入っていないとだめっぽい。

とりあえず、今日はここまで。

んー。一応、ミニマムコードでは、トラックバックできる条件を満たした記事を書いて見たんだけどなぁ。

うまくトラックバックが送信できないなー。

Share
カテゴリー: .NET

BlogEngine.NETでトラックバックを受信できない件について

送信については、なぜうまくいかないのかわからない。

受信について、TrackbackHandlerのソースを読んでみた感じだと、どうも、設定でEnable trackbacksのReceiveをTrueにしていると、どうも404エラーにするようになっているみたい。

たぶん、本当は

コメントが有効でないか、トラックバック受信が有効で無いときは、受け付けない。

としたかったのが、

コメントが有効でないか、トラックバック受信が有効のときは、受け付けない。

となっているみたいだ。

一応、PingBackHandlerの方のソースを見てみたら、ちゃんと

コメントが有効でないか、ピングバック受信が有効で無いときは、受け付けない。

というコードになっていたので、バグなのかな。

とりあえず、Receiveの設定をfalseにしておけばよいのだけど、それでもうまくいかないなぁ。

#feedbackできるだけの英語力がほしい。

Share
カテゴリー: .NET