我有一个非常简单的泛型构造函数方法:
public T Instance<T, TT>(TT parms) where T : class
{
return (T)Activator.CreateInstance(typeof(T), new[] { parms });
}
当我调用这样的方法时:
Instance<MyClass, string>("SomeStringValue").Customers.Where(x => x.Id == Id).Select(p => blah..blah...blah;
我得到一个'System.MissingMethodException: 找不到类型'MyClass'的构造函数。 at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture...'
我尝试添加绑定标志等,但没有任何运气。
我基本上是尝试用参数实例化一个对象。我可以毫无问题地显式声明对象:
var myObj = new MyClass("SomeStringValue");
但是我需要使用我的泛型构造函数。
谁能澄清我错过了什么?
编辑一个完整的程序(简化)。
public abstract class A
{
public T Instance<T, TT>(TT parms) where T : class
{
return (T)Activator.CreateInstance(typeof(T), new[] { parms });
}
}
public class B
{
public B(string someValue)
{
var myValue = someValue;
}
}
public class C
{
public void DoStuff()
{
var x = Instance<B, string>("SomeStringValue");
}
}
是我想做的。
您尝试调用的Activator<T>.CreateInstance()
重载需要 Object[]
类型的第二个参数。 您正在创建的新数组是一个TT[]
。 如果TT
被限制为类类型,则TT[]
可能满足Object[]
参数。 然而,不受约束的泛型TT[]
不能用作Object[]
。 一旦编译器确定TT[]
不能作为Object[]
传递,它就会(由于重载的第二个参数的params
规范),它会检查您传递的第二个参数是否符合Object
的条件。 因为所有的数组都派生自Object
,所以它会。 因此,编译器将创建一个类型为 Object
的单元素数组,该数组保存您尝试传入的TT[]
。 由于没有构造函数需要Object[]
,调用将失败。
如果要防止此问题,请创建一个包含相应参数的新Object[]
,而不是创建新的TT[]
。 这应该可以解决您的问题。
更改类 B 的构造函数,如下所示:
public B(object someValue)
{
var myValue = someValue;
}
您的代码将开始正常工作。