使用字符串创建对象

时间:2014-01-11 00:40:53

标签: c# .net reflection

所以,这是交易。我有一个名为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);
}

1 个答案:

答案 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"))