2009-10-26 26 views
6

Tôi nhận thấy tiêu đề cần được đọc nhiều lần để hiểu ... :)Làm thế nào tôi có thể vượt qua một phương pháp có được bằng cách phản ánh trong C# đến một phương thức chấp nhận phương thức như một đại biểu?

Tôi đã triển khai thuộc tính tùy chỉnh mà tôi áp dụng cho các phương pháp trong lớp học của mình. tất cả các phương pháp tôi áp dụng các thuộc tính để có chữ ký giống nhau và do đó tôi định nghĩa một delegate cho họ:

public delegate void TestMethod(); 

Tôi có một struct chấp nhận đại biểu đó như là một tham số

struct TestMetaData 
{ 
    TestMethod method; 
    string testName; 
} 

Có thể nhận được từ phản ánh một phương pháp có thuộc tính tùy chỉnh và chuyển nó vào cấu trúc vào thành viên 'phương pháp'?

Tôi biết bạn có thể gọi nó nhưng tôi nghĩ sự phản chiếu sẽ không cho tôi phương pháp thực tế từ lớp học của tôi mà tôi có thể truyền cho đại biểu TestMethod.

Trả lời

11

Khi bạn có MethodInfo qua Reflection, bạn có thể sử dụng Delegate.CreateDelegate để biến nó thành đại biểu, sau đó dùng Reflection để đặt trực tiếp thuộc tính/trường của cấu trúc của bạn.

+0

cảm ơn! làm việc hoàn hảo. – thedrs

1

Bạn có thể tạo đại biểu gọi phương thức phản ánh của bạn vào thời gian chạy bằng cách sử dụng Gọi hoặc Delegate.CreateDelegate.

Ví dụ:

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(); 
    } 
} 
+0

Delegate.CreateDelegate sẽ đơn giản hơn ... không có Gọi ở đó. –

+0

@Marc, bạn nói đúng, tôi đã cập nhật một mẫu bằng cách sử dụng CreateDelegate. – driis

0

Ngoài ra bạn cần đại biểu phù hợp để được đã tuyên bố

0

Như một ví dụ:

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(); } 
} 
Các vấn đề liên quan