0

我有一个非常简单的通用构造方法:

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 文化...'

我试过添加绑定标志等,但没有任何运气。

我基本上是在尝试用参数实例化一个对象。我可以毫无问题地明确声明对象:

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

是我想要做的。

4

2 回答 2

1

Activator<T>.CreateInstance()您尝试调用的重载需要 type 的第二个参数Object[]。您正在创建的新数组是一个TT[]. 如果TT被限制为类类型,则 aTT[]可能满足Object[]参数。但是,不受约束的泛型TT[]不能用作Object[]. 一旦编译器确定TT[]不能作为. 因为所有数组都派生自,所以它会。编译器将因此创建一个类型的单元素数组,其中包含Object[]paramsObjectObjectObjectTT[]你试图传入。由于没有构造函数需要一个Object[],所以调用将失败。

如果要防止此问题,请创建一个Object[]包含适当参数的新文件,而不是创建一个新的TT[]. 那应该可以解决您的问题。

于 2012-12-04T20:41:05.963 回答
-1

改变B类的构造函数如下图:

public B(object someValue)
    {
        var myValue = someValue;
    }

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

于 2012-12-04T20:38:18.093 回答