6 Stimmen

Wie kann ich eine Methode durch Reflexion in C# zu einer Methode, die die Methode als Delegat akzeptiert erworben übergeben?

Mir ist klar, dass man den Titel mehr als einmal lesen muss, um ihn zu verstehen ... :)

Ich habe ein benutzerdefiniertes Attribut implementiert, das ich auf Methoden in meinen Klassen anwende. Alle Methoden, auf die ich das Attribut anwende, haben die gleiche Signatur und daher habe ich einen Delegaten für sie definiert:

public delegate void TestMethod();

Ich habe eine Struktur, die diesen Delegaten als Parameter akzeptiert

struct TestMetaData
{
  TestMethod method;
  string testName;
}

Ist es möglich, von der Reflexion eine Methode zu erhalten, die das benutzerdefinierte Attribut hat und an die Struktur in das Element "Methode" übergeben?

Ich weiß, dass Sie es aufrufen können, aber ich denke, Reflexion wird nicht geben mir die tatsächliche Methode aus meiner Klasse, die ich auf den TestMethod-Delegat werfen kann.

12voto

Reed Copsey Punkte 536986

Sobald Sie die MethodInfo über Reflection erhalten haben, können Sie mit Delegate.CreateDelegate um ihn in einen Delegaten zu verwandeln, und verwenden Sie dann Reflection, um diesen direkt auf die Eigenschaft/das Feld Ihrer Struktur zu setzen.

2voto

driis Punkte 156110

Sie können einen Delegaten erstellen, der Ihre reflektierte Methode zur Laufzeit mit Invoke oder Delegate.CreateDelegate aufruft.

Ejemplo:

using System;
class Program
{
    public delegate void TestMethod();
    public class Test
    {
        public void MyMethod()
        {
            Console.WriteLine("Test");
        }
    }
    static void Main(string[] args)
    {
        Test t = new Test();
        Type test = t.GetType();
        var reflectedMethod = test.GetMethod("MyMethod");
        TestMethod method = (TestMethod)Delegate.CreateDelegate(typeof(TestMethod), t, reflectedMethod);
        method();
    }
}

0voto

Ilya Khaprov Punkte 2538

Außerdem müssen Sie einen geeigneten Delegaten bereits deklariert haben

0voto

Marc Gravell Punkte 970173

Ein Beispiel:

using System;
using System.Linq;

using System.Reflection;
public delegate void TestMethod();
class FooAttribute : Attribute { }
static class Program
{
    static void Main() {
        // find by attribute
        MethodInfo method =
            (from m in typeof(Program).GetMethods()
             where Attribute.IsDefined(m, typeof(FooAttribute))
             select m).First();

        TestMethod del = (TestMethod)Delegate.CreateDelegate(
            typeof(TestMethod), method);
        TestMetaData tmd = new TestMetaData(del, method.Name);
        tmd.Bar();
    }
    [Foo]
    public static void TestImpl() {
        Console.WriteLine("hi");
    }
}

struct TestMetaData
{
    public TestMetaData(TestMethod method, string name)
    {
        this.method = method;
        this.testName = name;
    }
    readonly TestMethod method;
    readonly string testName;
    public void Bar() { method(); }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X