所以,这是交易。我有一个名为IBehavior的界面。我的每个实体都有一个变量:private IBehavior _behavior
。每个实体也有一个变量:public string Behavior
。加载我的实体后,字符串将从xml文件中填充。随后,在所有实体上调用名为init()
的函数。此方法接受字符串并使用此行代码调用所需的构造函数:Type.GetType(Behavior).GetConstructor(Type.EmptyTypes).Invoke(null);
。
不幸的是,Invoke()方法返回Object类型的东西,而_behavior变量在没有强制转换的情况下不会接受它。我试过这种方法:
_behavior = (IBehavior)Type.GetType(Behavior).GetConstructor(Type.EmptyTypes).Invoke(null);
。
所有这一切都告诉我,我的_bahavior
变量为空,因此不会发生这种情况。我可能错误地使用GetConstructor()
。有人可以指出我正确的方向吗?
初始化功能:
public void Init()
{
if (Behavior == "null" || Behavior == "none")
{
_behavior = null;
return;
}
_behavior = (IBehavior) Type.GetType(Behavior).GetConstructor(Type.EmptyTypes).Invoke(new object(), null);
}
答案 0 :(得分:3)
要从名称创建类型,请使用:
_behavior = (IBehavior)Activator.CreateInstance(Type.GetType(Behavior));
您的代码的另一个问题是您在new object()
上调用构造函数,因为您使用MethodBase.Invoke(Object, Object[])
方法:
.GetConstructor(Type.EmptyTypes).Invoke(new object(), null)
并且只指定对象数组,使用ConstructorInfo.Invoke(Object[])
方法:
_behavior = (IBehavior)Type.GetType(Behavior)
.GetConstructor(Type.EmptyTypes)
.Invoke(new object[] { });
注意 :如果您从ArgumentNullException
收到Activator.CreateInstance
,请记住必须使用命名空间指定类型(如果在同一个程序集中定义) ,像:
Activator.CreateInstance(Type.GetType("ConsoleApplication.SomeClass"))