(T)Activator.CreateInstance(typeof(T), new[] { parms }); thr



我有一个非常简单的泛型构造函数方法:

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;
    }

您的代码将开始正常工作。

最新更新