2010-03-03 148 views
3

我想使用的MethodInfo MakeGenericMethod如下方法:C#反射,使用MakeGenericMethod与具有 '新的()' 类型的约束

 foreach (var type in types) 
     { 
      object output = null; 
      var method = typeof (ContentTypeResolver).GetMethod("TryConstruct"); 
      var genmethod = method.MakeGenericMethod(type); 
      var arr = new object[] { from, output }; 
      if ((bool)genmethod.Invoke(null, arr)) 
       return (IThingy)arr[1]; 
     } 

对下列通用方法:

public static bool TryConstruct<T>(string from, out IThingy result) where T : IThingy, new() 
    { 
     var thing = new T(); 
     return thingTryConstructFrom(from, out result); 
    } 

我遇到的问题是,我在MakeGenericMethod行上得到一个参数异常,因为我传递的类型不是'new()'

有没有办法绕过这个? 谢谢

回答

5

不可以。只能制作封闭构建的TryConstruct方法,其类型参数符合IThingynew约束条件。否则,你会击败TryConstruct合同:当你打电话给TryConstruct时它会发生什么,并且它碰到了new T()这一行?有没有一个T()构造函数,所以你会违反类型安全。

在将它传递给MakeGenericMethod之前,您需要检查该类型是否具有公共的默认构造函数。如果您需要使用非默认构造函数实例化类型,则需要创建一个新方法或一个TryConstruct重载,或许使用Activator.CreateInstance而不是new T()

+0

很好的回答,谢谢! – Dve 2010-03-03 22:26:06