2

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

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

4 回答 4

7

试试这个:

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

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

于 2009-06-11T16:19:25.240 回答
1

构造函数是公开的吗?

是 type 的单个参数BookingContext吗?

问题是,这显然是一个更大系统的一部分——如果你能制作一个简短但完整的程序来证明这个问题,那么帮助你会容易得多。然后我们可以修复该程序中的问题,您可以将修复移植回您的真实系统。否则我们真的只是在猜测:(

于 2009-06-11T16:19:00.360 回答
0

This worked for me.

Type.GetType("namespace.class, namespace");

于 2009-09-08T17:55:05.110 回答
0

SingleItemNew 构造函数是否将 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 });
于 2009-06-11T16:24:47.037 回答