所以,这是交易。我有一个名为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);
}
要根据名称创建类型,请使用:
_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"))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句