2

我一直在阅读旧问题和搜索 MSDN 帮助,但我无法真正理解 PropertyInfo 是什么,特别是与遍历数组列表的问题有关

c# foreach(对象中的属性)...有没有一种简单的方法可以做到这一点?)

我做了一个简单的类

public MyClass
{
public double myProperty; // etc
}

然后我将类对象添加到列表中。我想遍历列表,只更改每个对象的属性

foreach ( MyClass i in MyClassList)
{
foreach ( double myProperty in i.GetType().GetProperties() )
{
// do something
}


}

但我得到一个错误。在链接的问题(上面)中,它说使用 PropertyInfo 而不是'double。应该替换 myProperry 的“双重”的 PropertyInfo 是什么,它代表什么?

4

3 回答 3

1

你可能想要这个:

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;
}
于 2012-11-01T13:22:54.013 回答
1

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;
}

这将比原始反射快得多,同时在运行时查找属性名称方面具有更大的灵活性。

于 2012-11-01T13:30:09.717 回答
0

GetProperties 返回 PropertyInfo 对象的集合。

然后,您需要迭代(或搜索)该集合以获得所需的属性。

有关使用 GetProperties() 的示例,请参见此处

http://rhondatipton.net/2010/02/28/using-getproperties-in-c/

于 2012-11-01T13:22:05.883 回答