我正在尝试使用MethodInfo 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()'
有没有办法解决这个问题? 感谢
答案 0 :(得分:5)
没有。您只能使用符合IThingy
和new
约束的类型参数创建闭合构造的TryConstruct方法。否则你将击败TryConstruct合同:当你调用TryConstruct并且它击中new T()
线时会发生什么?不会是一个T()构造函数,所以你违反了类型安全。
在将类型传递给MakeGenericMethod之前,您需要检查该类型是否具有公共默认构造函数。如果需要使用非默认构造函数实例化类型,则需要创建一个新方法或TryConstruct重载,可能使用Activator.CreateInstance而不是new T()
。