我在工厂模式样式函数中使用(稍微扩展版本)以下代码:
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,它有一个带有单个参数的构造函数。
有谁知道问题是什么?
干杯,艾德
答案 0 :(得分:7)
试试这个:
Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
CheckoutContext output =
(CheckoutContext)Activator.CreateInstance(contextType, data);
您编码不起作用的原因是Activator.CreateInstance
实际上没有您想要的重载。所以你可能想知道为什么代码会编译!原因是,它有一个重载,需要(Type type, params object[] args)
匹配你的方法调用,所以它编译,但在运行时,它会搜索你的类型的构造函数采取BindingFlags
和BookingContext[]
这是显然不是你的类型。
答案 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”);