DOBON.NET DOBON.NETプログラミング掲示板過去ログ

System.Reflectionを使用して、delegateを設定する方法

環境/言語:[Windows XP / .NET 2.0 / できればC#]
分類:[.NET]

いつもお世話になっております。
じゅでです。

今回の質問は、アセンブリファイルをロードして、取得したアセンブリより、
クラスを取得し、特定のプロパティを設定する方法です。

問題になっているのが、プロパティで設定する内容が、
delegateとなっている事です。

プロパティの取得自体は、以下のような形で出来るのですが、
その後の、設定方法がわかりません。
// プロパティ取得
System.Reflection.PropertyInfo pi = targetClass.GetType().GetProperty(PROPERTY_NAME, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

そもそもSetValueでdelegateの設定が出来るのかというのが謎です。
使い方自体が間違っているのでしょうか?
それとも、FieldInfoを使うと設定できたりするのでしょうか?

どなたかわかる方がいらっしゃいましたら、ご教授下さい。
よろしくお願いいたします。

以上
そのメンバがプロパティとして定義されているなら PropertyInfo.SetValue で設定できるでしょうし、フィールドとして定義されているなら FieldInfo.SetValue を使うことになるでしょう。イベントとして定義されているなら EventInfo.AddEventHandler です。
まあ pi が null でなければプロパティなんでしょう。

// 何が分からないのかがどうも読み取れませんでした。
申し訳ありません。
わかりにくかったようで。

> // 何が分からないのかがどうも読み取れませんでした。

実際にpiは取得できてます。

何処がわからないかというと、以下の部分です。
pi.SetValue(targetClass, "ここがわからない", null);

delegateに登録したいmethodをどのように定義したらいいのかが、
わからないのです。
(なので、実際Delegateというと、混乱しますね。申し訳ありませんでした。)


delegateの定義自体は以下のようになっています。

internal delegate void Sample(string hoge);

private Sample _sampleDesuyo;

internal Sample SampleDesuyo
{
set{ _sampleDesuyo = value; }
}

上記のような状態で、実コード側は以下のようにdelegateの設定をしています。

class.SampleDesuyo = TourokuMethodDesuyo;

上記のように使っているのですが、NUnitでテストをする際に、
internalなので、どうしようかと。

そこで、SetValueを使ってみようかと思い立ったのですが、
stringなどの文字列なら、意外と素直に(object)なんかで設定できたのですが、
deregateはmethodなのですが、どうしたら登録ができるのかと思い、質問させて頂きました。
> delegateに登録したいmethodをどのように定義したらいいのかが、
> わからないのです。
メソッドはメソッドですから、普通に要求されるデリゲートのシグネチャに一致したメソッドを定義すればいいだけです。
分からないのは SetValue に渡すデリゲートのインスタンスの作り方、ですね。

> deregateはmethodなのですが、どうしたら登録ができるのかと思い、質問させて頂きました。
デリゲートはメソッドではありません。クラスの一種です。そして普通に new してインスタンスを作ることができます。
イベントにイベントハンドラを追加するときに
button1.Click += new EventHandler(button1_Click);
って書きますよね。コンストラクタの引数がメソッド名になると言う以外はなにも特殊なことはありません。
// C# 2.0 から button1.Click += button1_Click; という記述が可能になりましたが、これは一種の糖衣構文であり、コンパイル時には new を使った記述と全く同じ扱いになります。

> delegateの定義自体は以下のようになっています。
> internal delegate void Sample(string hoge);
で、この Sample デリゲートも当然インスタンスを作る必要があります。
Delegate クラスには CreateDelegate が用意されていて、目的のデリゲートを指すType オブジェクトさえ手に入れれば比較的簡単にインスタンスを作成できます。
2008/01/08(Tue) 16:26:25 編集(投稿者)

ありがとうございます。
凄く本当に感謝です。

> 分からないのは SetValue に渡すデリゲートのインスタンスの作り方、ですね。
まさしくその通りです。
わかりにくくて申し訳ありません。

> Delegate クラスには CreateDelegate が用意されていて、目的のデリゲートを指すType オブジェクトさえ手に入れれば比較的簡単にインスタンスを作成できます。

理解いたしました。

最初にまずデリゲートを定義しているフィールドを取得して、
Typeを取得後に、CreateDelegateで取得したフィールドのTypeで
Delegateクラスを作成して、それをobjectに対して
設定すればよいという事ですね。

delegateで定義してるんだからDelegateに入れれば良いのですね。

ありがとうございます。
大変助かりました。

まだ試しては無いですが、出来そうですので、解決済みにします。


// 昔々質問して、出来上がったらのっけますといっている、
// パラメータの取得については、今現在ちょっと手が出せてないです。
// 挫折しそうですが・・・時間が出来たら、またいじくってみます。


追記:解決済みチェック
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板