(T)Activator.CreateInstance(typeof(T),new [] {parms});抛出MissingMethodException

时间:2012-12-04 18:55:59

标签: .net generics reflection c#-3.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 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");
  }
}

我正在尝试做什么。

2 个答案:

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

您的代码将开始正常运行。