2009-07-07 9 views
2

Ich verwende Reflection-Klasse, um einige Methoden aufzurufen, die auf der anderen DLL sind. Einer der Parameter der Methode ist der Typ des Delegaten.Wie konvertiert man Delegat zu Objekt in C#?

Und ich möchte diese Methoden durch Verwendung von Reflexion aufrufen. Also muss ich Funktionsparameter als Objekt-Array übergeben, aber ich konnte nichts über finden, wie Delegat zu Objekt konvertieren.

Vielen Dank im Voraus

+0

können Sie nach ein Codebeispiel von dem, was Sie zu konvertieren sind versuchen? Das erlaubt den Leuten, wirklich quiz und genau zu antworten –

Antwort

5

Ein Delegat ist ein Objekt. Erstellen Sie den erwarteten Delegaten wie gewohnt und übergeben Sie ihn im Parameterarray. Hier ist ein ziemlich konstruiertes Beispiel:

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

Easy Matt, ich glaube, du hast vergessen, ein erklärendes Beispiel einzubauen! –

1

Instanzen von Delegierten Objekte sind, so dass dieser Code funktioniert (C# 3 Stil):

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

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

Hoffe, es hilft!

Cédric

1

Hier ist ein Beispiel:

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

danke für Ihre Antwort. Ich habe versucht auf Ihre Weise, ich bin am gleichen Delegat, die in der externen DLL ist, übergeben, aber es gibt seltsame Ausnahme, die sagt; Argument Ausnahme: Das Objekt mit dem Typ "namespace.class.delegate" kann nicht in "namespace.class.delegate" umgewandelt werden – AFgone

1

Ich bin nicht sicher, ob ich Ihre Frage richtig verstanden habe, aber Sie können einen Delegaten Objekt aus einer Methode wie folgt erstellen:

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

Dann erstellen Sie ein Delegat-Objekt wie folgt:

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

Sie können einen Delegaten als Variablentyp "Funktion" sehen. Der Delegat beschreibt die Parameter und den Rückgabewert für eine Matching-Funktion.

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

Das obige Beispiel erlaubt ‚Foo‘ als ein Datentyp verwendet werden, das einzige Objekt erlaubt, die mit einer Variablen des Typ Foo Datentypen angepasst werden können, ein Verfahren mit der gleichen Signatur ist so:

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. 

Sobald Sie eine Methode, um einen Delegaten zugewiesen haben, können Sie die Methode über den Delegaten aufrufen:

int n = 1; 
D(n);  // or D.Invoke(n); 
Verwandte Themen