Activator.CreateInstance(t,42,args)找不到构造函数

时间:2009-06-11 16:06:40

标签: c# .net types activator createinstance

我在工厂模式样式函数中使用(稍微扩展版本)以下代码:

public class SingleItemNew : CheckoutContext { public BookingContext Data { get; set; } public SingleItemNew(BookingContext data) { Data = data; } } public CheckoutContext findContext(BookingContext data) { Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString()); CheckoutContext output = Activator.CreateInstance(contextType, BindingFlags.CreateInstance, new[] { data }) as CheckoutContext; return output; }

然而,它在运行时抛出一个未找到异常的构造函数,我无法弄清楚原因。

data.Case.ToString()方法返回一个类的名称,SingleItemNew,它有一个带有单个参数的构造函数。

有谁知道问题是什么?

干杯,艾德

4 个答案:

答案 0 :(得分:7)

试试这个:

  Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
  CheckoutContext output = 
      (CheckoutContext)Activator.CreateInstance(contextType, data);

您编码不起作用的原因是Activator.CreateInstance实际上没有您想要的重载。所以你可能想知道为什么代码会编译!原因是,它有一个重载,需要(Type type, params object[] args)匹配你的方法调用,所以它编译,但在运行时,它会搜索你的类型的构造函数采取BindingFlagsBookingContext[]这是显然不是你的类型。

答案 1 :(得分:1)

构造函数是否公开?

类型为BookingContext的单个参数?

麻烦的是,这显然是一个更大系统的一部分 - 如果你能够产生一个证明问题的short but complete program,那么很多会更容易帮助你。然后我们可以解决该程序中的问题,您可以将修复程序移回实际系统。否则我们真的只是在猜测:(

答案 2 :(得分:0)

SingletoN构造函数是否将BookingContext作为参数?如果它不完全匹配则会失败:

class ParamType   {    }
class DerivedParamType : ParamType    {    }
class TypeToCreate
{
    public TypeToCreate(DerivedParamType data)
    {
        // do something
    }
}

ParamType args = new ParamType();
// this call will fail: "constructor not found"
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });

// this call would work, since the input type matches the constructor
DerivedParamType args = new DerivedParamType();
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });

答案 3 :(得分:0)

这对我有用。

Type.GetType(“namespace.class,namespace”);