【问题标题】:Foreach change property. What is PropertyInfo?Foreach 更改属性。什么是 PropertyInfo?
【发布时间】:2012-11-01 13:18:36
【问题描述】:

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

c# foreach (property in object)... Is there a simple way of doing this?)

我做了一个简单的类

public MyClass
{
public double myProperty; // etc
}

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

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


}

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

【问题讨论】:

  • myProperty 实际上不是一个属性...它是一个字段;它不会在GetProperties 中显示

标签: c# reflection arraylist propertyinfo


【解决方案1】:

PropertyInfo 仅表示为该类型定义了属性这一事实;它不是每个对象 - 它是针对类型的。您不需要任何实例即可获得PropertyInfo

不过,首先,请注意 myProperty 当前不是一个属性:让我们先修复它:

public MyClass
{
    public double MyProperty {get;set;}
}

现在我们可以通过询问“它拥有的所有属性”来了解该属性,即

PropertyInfo[] props = typeof(MyClass).GetProperties();

或单个属性,可能在运行时从配置中获取名称:

PropertyInfo prop = typeof(MyClass).GetProperty("MyProperty");

您可以检查 PropertyInfo 的名称、类型、属性等 - 对于库代码非常有用。但是,在常规代码中,最简单的选择就是使用静态 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;
}

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

【讨论】:

  • 谢谢马克。我没有使用 get: set 就作弊了。这是个大问题,但我很感激你的解释!
【解决方案2】:

你可能想要这个:

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

【讨论】:

    【解决方案3】:

    GetProperties 返回一个 PropertyInfo 对象的集合。

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

    查看此处获取使用 GetProperties() 的示例

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2019-01-08
      相关资源
      最近更新 更多