C# Foreach更改属性。什么是PropertyInfo?
我一直在阅读搜索MSDN帮助时提出的旧问题,但我无法真正理解PropertyInfo是什么,特别是与数组列表循环相关的问题 ) 我上了一堂简单的课C# Foreach更改属性。什么是PropertyInfo?,c#,reflection,arraylist,propertyinfo,C#,Reflection,Arraylist,Propertyinfo,我一直在阅读搜索MSDN帮助时提出的旧问题,但我无法真正理解PropertyInfo是什么,特别是与数组列表循环相关的问题 ) 我上了一堂简单的课 public MyClass { public double myProperty; // etc } 然后我将类对象添加到列表中。我想在列表中循环,只更改每个对象的一个属性 foreach ( MyClass i in MyClassList) { foreach ( double myProperty in i.GetType().GetPro
public MyClass
{
public double myProperty; // etc
}
然后我将类对象添加到列表中。我想在列表中循环,只更改每个对象的一个属性
foreach ( MyClass i in MyClassList)
{
foreach ( double myProperty in i.GetType().GetProperties() )
{
// do something
}
}
但是我犯了一个错误。在上面的链接问题中,它说使用PropertyInfo而不是double。什么是应该替换MyProperty的“double”的PropertyInfo?它代表什么?GetProperties返回PropertyInfo对象的集合 然后需要迭代(或搜索)该集合以获得所需的属性 有关使用GetProperties()的示例,请参见此处
您可能想要:
foreach (MyClass i in MyClassList)
{
foreach (var myProperty in i.GetType().GetProperty("myProperty") )
{
myProperty.SetValue(i, 1.23);
}
}
这相当于:
foreach (MyClass i in MyClassList)
{
i.myProperty = 1.23;
}
PropertyInfo
仅表示为该类型定义属性的事实;它不是针对每个对象的,而是针对类型的。您不需要任何实例来获取属性信息
但是,首先请注意,myProperty
当前不是一个属性:让我们首先修复它:
public MyClass
{
public double MyProperty {get;set;}
}
现在我们可以通过询问“它拥有的所有属性”,即
或单个属性,可能在运行时从配置中获取名称:
PropertyInfo prop = typeof(MyClass).GetProperty("MyProperty");
您可以检查PropertyInfo
中的名称、类型、属性等,这对库代码非常有用。然而,在常规代码中,最简单的选择就是使用静态C#:
如果需要通过反射执行此操作,则可以使用SetValue
:
foreach(MyClass obj in MyClassList) {
prop.SetValue(obj, 123.45, null);
}
但是,反射相对较慢,除非您进行更大的长度。例如,针对“运行时我会知道名称”场景的另一个备选方案是;然后你可以做:
var accessor = TypeAccessor.Create(typeof(MyClass));
string propName = "MyProperty";
object value = 123.45;
foreach(MyClass obj in MyClassList) {
accessor[obj, propName] = value;
}
这将比原始反射快得多,同时在运行时查找属性名称方面具有更大的灵活性。myProperty
实际上不是一个属性。。。这是一个领域;它将不会显示在GetProperties
中。我没有使用get:set作弊。这是个大问题,但我很感激你的解释!
foreach(MyClass obj in MyClassList) {
prop.SetValue(obj, 123.45, null);
}
var accessor = TypeAccessor.Create(typeof(MyClass));
string propName = "MyProperty";
object value = 123.45;
foreach(MyClass obj in MyClassList) {
accessor[obj, propName] = value;
}