我有一个非常简单的通用构造方法:
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'的构造函数。 在System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr,Binder binder,Object [] args,CultureInfo culture ......'
我尝试过添加bindingflags等但没有运气。
我基本上试图用参数实例化一个对象。 我可以毫无问题地明确声明对象:
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");
}
}
我正在尝试做什么。
答案 0 :(得分:1)
您尝试调用的Activator<T>.CreateInstance()
重载需要第二个Object[]
类型的参数。您正在创建的新阵列是TT[]
。如果TT
被约束为类类型,则TT[]
可能会满足Object[]
参数。但是,无约束的通用TT[]
不能用作Object[]
。一旦编译器确定TT[]
不能作为Object[]
传递,那么(因为重载的第二个参数上的params
规范),它会检查第二个参数是否为你'传球符合资格Object
。因为所有数组都来自Object
,所以它会。因此,编译器将创建一个类型为Object
的单元素数组,其中包含您尝试传入的TT[]
。由于没有构造函数需要Object[]
,因此调用将失败。
如果您想要阻止此问题,请创建一个包含相应参数的新Object[]
,而不是创建新的TT[]
。这应该可以解决你的问题。
答案 1 :(得分:-1)
更改B类的构造函数,如下所示:
public B(object someValue)
{
var myValue = someValue;
}
您的代码将开始正常运行。