具有Activator的实例不能访问属性,反射



我有一个问题,我想做一个通用的方法来实例化模型车的表,显然是字符串。

我应用了以下代码:

object item = Activator.CreateInstance(Type.GetType("eStartService." + tableName));

当我执行item.*something*时,我没有看到应该调用的表的属性。

这是我第一次使用反射,也许我做错了什么?

这是因为编译器和智能感知将实例化的对象视为"对象"而不是实际类型。对象类型没有您期望的属性。您需要将实例化的对象强制转换为相关类型。像这样:

YourType item = (YourType)Activator.CreateInstance(Type.GetType("YourType"));
item.property = ...;

但是,由于您的类型是在运行时而不是编译时确定的,因此您必须使用其他方法:

定义类型之间的公共接口

如果所有要实例化的类型都有一个共同的行为,你可以定义一个共同的接口,并在这些类型中实现它。然后你可以将实例化的类型强制转换为该接口,并使用它的属性和方法。

interface IItem { 
   int Property {
       get;
      set;
   }
}
class Item1 : IItem {
    public int Property {
        get;
       set;
    }
}
class Item2 : IItem {
    public int Property {
        get;
       set;
    }
}
IItem item = (IItem)Activator.CreateInstance(Type.GetType("eStartService." + tableName));
item.Property1 = ...;

使用反射

您可以使用反射来访问实例化类型的成员:

Type type = Type.GetType("eStartService." + tableName);
object item = Activator.CreateInstance(type);
PropertyInfo pi = type.GetProperty("Property", BindingFlags.Instance);
pi.SetValue(item, "Value here");

在这种情况下当然没有智能感知。

使用动态类型

dynamic item = Activator.CreateInstance(Type.GetType("eStartService." + tableName));
item.Property = ...;

上面的代码可以编译,但是你仍然看不到智能感知建议,因为"table"类型是在运行时确定的。

相关内容

  • 没有找到相关文章

最新更新