2009-07-07 13 views
2

リフレクションクラスを使用して、他のDLLにあるメソッドを呼び出しています。 また、メソッドのパラメータの1つがデリゲートの型です。デリゲートをC#でオブジェクトに変換する方法は?

そして、このメソッドをリフレクションを使用して呼び出す必要があります。 オブジェクト配列として関数のパラメータを渡す必要がありますが、私は オブジェクトを代理人に変換する方法について何も見つかりませんでした。

ありがとうございます。

+0

はあなたが変換しようとしているもののコードサンプルを投稿することができますか?それは人々が本当にquivklyと正確に応答することができます –

答えて

5

代理人はオブジェクトです。通常と同じように、期待されるデリゲートを作成し、それをparameters配列に渡します。ここでは、むしろ不自然な例です:代表者の

class Mathematician { 
    public delegate int MathMethod(int a, int b); 

    public int DoMaths(int a, int b, MathMethod mathMethod) { 
     return mathMethod(a, b); 
    } 
} 

[Test] 
public void Test() { 
    var math = new Mathematician(); 
    Mathematician.MathMethod addition = (a, b) => a + b; 
    var method = typeof(Mathematician).GetMethod("DoMaths"); 
    var result = method.Invoke(math, new object[] { 1, 2, addition }); 
    Assert.AreEqual(3, result); 
} 
+0

簡単なマット、私は説明の例を含めることを忘れたと思います! –

1

インスタンスはオブジェクトであるので、このコードは(C#3スタイル)作品:

Predicate<int> p = (i)=> i >= 42; 

Object[] arrayOfObject = new object[] { p }; 

はそれが役に立てば幸い!

セドリック

1

は、ここに例を示します

class Program 
{ 
    public delegate void TestDel(); 

    public static void ToInvoke(TestDel testDel) 
    { 
     testDel(); 
    } 

    public static void Test() 
    { 
     Console.WriteLine("hello world"); 
    } 

    static void Main(string[] args) 
    { 
     TestDel testDel = Program.Test; 
     typeof(Program).InvokeMember(
      "ToInvoke", 
      BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, 
      null, 
      null, 
      new object[] { testDel }); 
    } 
} 
+0

ご返信ありがとうございます。 私はあなたのやり方で試してみましたが、私は外部DLLにある同じデリゲートを渡していますが、奇妙な例外があります。 引数例外: "namespace.class.delegate"型のオブジェクトは "namespace.class.delegate"には適用できません。 – AFgone

1

私は私が正しくあなたの質問を理解してかどうかわからないんだけど、あなたは、このような方法から、デリゲートオブジェクトを作成することができます。

public class Test 
{ 
    public static void Method() {} 
} 

次に、次のようにデリゲートオブジェクトを作成します。

Delegate myDelegate = new Delegate(Test.Method); 
0

代理人は、変数型 "関数"として表示されます。デリゲートは、一致する関数のパラメータと戻り値を記述します。

delegate void Foo(int a); // here a new delegate obj type Foo has been declared 

上記の例では、「foo」では、データ型として使用することができ、型Fooのデータ型の変数と一致させることができるのみ許可オブジェクトはそう同じシグネチャを持つ方法でありますあなたがデリゲートにメソッドを割り当てると

void MyFunction(int x);  

Foo D = MyFunction; // this is OK 

void MyOtherFunction(string x); 

Foo D = MyOtherFunction; // will yield an error since not same signature. 

は、あなたがデリゲート経由でメソッドを呼び出すことができます。

​​
関連する問題