2017-11-27 11 views
2

私はC#でReflection機能を使用しているDLLにプロパティを持っています。私はプロパティを設定したいと思いますし、プロパティの型はデリゲート型です。プロパティがデリゲート型である場合にC#でリフレクションを使用してプロパティ値を設定する方法

Reflectionを使用してプロパティを設定する手順を教えてください。

これを行うにはSetValueメソッドを使用する必要がありますが、デリゲートタイプのプロパティを設定する方法はわかりません。

SetValue(objectName、1、null)は、リフレクションを使用して整数プロパティを設定しますが、デリゲートタイプのプロパティを設定する方法はわかりません。

代理人プロパティタイプの変数を宣言し、リフレクションを使用して初期化するにはどうすればよいですか?

+0

*イベント*を設定/追加しますか?例えば。 'Button.Click'? –

答えて

2

それは、我々はキャストする必要がありそう

void Main() 
{ 
    var a = new A(); 

    var type = a.GetType(); 

    var delegateProperty = type.GetProperty(nameof(A.Action)); 

    delegateProperty.SetValue(a, (Action)(() => Console.WriteLine("via reflection"))); 

    a.Action(); 
} 

ノートのような反射を経由して、それを設定することができ、そのような

class A 
{ 
    public Action Action { get; set; } 
} 

としてデリゲートプロパティを持つクラスを考えると

かなり簡単ですラムダ式をデリゲート型に変換すると、ここではSystem.Action型推論コンテキストは存在しませんが、それは重要ではないため、VAを取得するための多くの方法の1つに過ぎませんデリゲート型のルー

どのようにデリゲートプロパティの型の変数を宣言し、それが反射を利用して を初期化するために:しかし、あなたの質問の後半部分に私たちを導くん

宣言されたプロパティに一致する型のデリゲート値を作成する必要があります。この場合、プロパティはSystem.Actionでした。デリゲートが含まれている場合

var type = typeof(MyClass); 

var action = new Action<object>((o) => Console.WriteLine("Invoked with {0}", o)); 
var obj = new MyClass(); 
type.GetProperty("Simple", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(obj, action); 

:プロパティを設定

public class MyClass 
{ 
    internal Action<object> Simple { get; set; } 
} 

:このクラスを想定し

:最も単純なレベルで

1

あなたがintプロパティを設定し、それを同じように設定します引数としてパブリックではないタイプの場合でも、共分散/反動に応じてobjectを使用して設定できます。

と仮定:デリゲート型自体が内部である場合Action<object>でプロパティを設定し、あるとして以下のクラスを想定し

はまだあなたがその内部のデリゲート型のインスタンスを作成する必要が

public class MyClass 
{ 
    internal Action<Arg> Simple { get; set; } 
} 
internal class Arg { } 

動作します:

public class MyClass 
{ 
    internal Internal Simple { get; set; } 
} 
internal class Arg { } 

internal delegate void Internal(Arg arg); 

あなたは使用することができます。

var type = typeof(MyClass); 

var prop = type.GetProperty("Simple", BindingFlags.NonPublic | BindingFlags.Instance); 
var action = new Action<object>((o) => Console.WriteLine("Invoked with {0}", o)); 
var delegateInsrtance = Delegate.CreateDelegate(prop.PropertyType, action.Target, action.Method); 
var obj = new MyClass(); 
prop.SetValue(obj, delegateInsrtance); 

注:上記のコードは動作しますが、我々は(引数は明示的なキャストは必要ありません)Internalデリゲートと互換性を持つことができるデリゲート(Action<object>)を作成し、新しいを作成するために、そのデリゲートのMETHODINFOを使用しているため内部代議員。これを作成したいデリゲートのタイプによっては、やりにくくなるかもしれませんが、もっと情報がなければ、これは良い例です。

関連する問題