2012-01-01 37 views
6

Đây là vấn đề của tôi;Gọi phương thức không chung chung với các đối số chung được xác định trong một lớp chung

public class MyClass<T> 
{ 
    public void DoSomething(T obj) 
    { 
     .... 
    } 
} 

Những gì tôi đã làm là:

var classType = typeof(MyClass<>); 
Type[] classTypeArgs = { typeof(T) }; 
var genericClass = classType.MakeGenericType(classTypeArgs); 
var classInstance = Activator.CreateInstance(genericClass); 
var method = classType.GetMethod("DoSomething", new[]{typeof(T)}); 
method.Invoke(classInstance, new[]{"Hello"}); 

Trong trường hợp trên, ngoại trừ tôi nhận được là: hoạt động Cuối ràng buộc không thể thực hiện trên các loại hoặc các phương pháp mà ContainsGenericParameters là đúng.

Nếu tôi cố gắng làm cho phương pháp chung chung không thành công một lần nữa với ngoại lệ: MakeGenericMethod chỉ có thể được gọi trên phương thức mà MethodBase.IsGenericMethodDefinition là đúng.

Tôi nên gọi phương thức như thế nào?

Trả lời

11

Bạn đang gọi GetMethod trên đối tượng không đúng. Gọi nó với bị ràng buộc loại chung và nó sẽ hoạt động. Đây là mẫu hoàn chỉnh hoạt động chính xác:

using System; 
using System.Reflection; 

internal sealed class Program 
{ 
    private static void Main(string[] args) 
    { 
     Type unboundGenericType = typeof(MyClass<>); 
     Type boundGenericType = unboundGenericType.MakeGenericType(typeof(string)); 
     MethodInfo doSomethingMethod = boundGenericType.GetMethod("DoSomething"); 
     object instance = Activator.CreateInstance(boundGenericType); 
     doSomethingMethod.Invoke(instance, new object[] { "Hello" }); 
    } 

    private sealed class MyClass<T> 
    { 
     public void DoSomething(T obj) 
     { 
      Console.WriteLine(obj); 
     } 
    } 
} 
+0

Hoàn hảo! Điều này đã có stumped của tôi trong nhiều giờ .... – CRG

Các vấn đề liên quan