PropertyInfo
仅表示为该类型定义了属性的事实;它不是每个对象 - 它是针对类型的。您不需要任何实例即可获得PropertyInfo
.
但是,首先请注意,这myProperty
当前不是一个属性:让我们先修复它:
public MyClass
{
public double MyProperty {get;set;}
}
现在我们可以通过询问“它拥有的所有属性”来了解该属性,即
PropertyInfo[] props = typeof(MyClass).GetProperties();
或单个属性,可能在运行时从配置中获取名称:
PropertyInfo prop = typeof(MyClass).GetProperty("MyProperty");
您可以检查 aPropertyInfo
的名称、类型、属性等 - 对于库代码非常有用。但是,在常规代码中,最简单的选择就是使用静态 C#:
foreach(MyClass obj in MyClassList) {
obj.MyProperty = 123.45;
}
如果您需要通过反射来做到这一点,那么您可以使用SetValue
:
foreach(MyClass obj in MyClassList) {
prop.SetValue(obj, 123.45, null);
}
但是,除非您花费更长的时间,否则反射相对较慢。例如,针对“我会在运行时知道名称”场景的另一种替代方案是FastMember;那么你可以这样做:
var accessor = TypeAccessor.Create(typeof(MyClass));
string propName = "MyProperty";
object value = 123.45;
foreach(MyClass obj in MyClassList) {
accessor[obj, propName] = value;
}
这将比原始反射快得多,同时在运行时查找属性名称方面具有更大的灵活性。