带有 Activator 的实例无法访问属性,反射
instance with Activator not access the properties , reflection
我有一个问题,我想制作一个通用方法来实例化模型车的 table,显然是通过字符串。
我应用了这段代码:
object item = Activator.CreateInstance(Type.GetType("eStartService." + tableName));
当我 item.*something*
时,我没有看到应该调用的 table 的属性。
我是第一次使用反射,可能我做错了什么?
那是因为编译器和智能感知将实例化对象视为 "object" 而不是实际类型。该对象类型没有您期望的属性。您需要将实例化对象转换为相关类型。像这样:
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" 类型是在运行时确定的。
我有一个问题,我想制作一个通用方法来实例化模型车的 table,显然是通过字符串。
我应用了这段代码:
object item = Activator.CreateInstance(Type.GetType("eStartService." + tableName));
当我 item.*something*
时,我没有看到应该调用的 table 的属性。
我是第一次使用反射,可能我做错了什么?
那是因为编译器和智能感知将实例化对象视为 "object" 而不是实际类型。该对象类型没有您期望的属性。您需要将实例化对象转换为相关类型。像这样:
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" 类型是在运行时确定的。