Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Foreach更改属性。什么是PropertyInfo?_C#_Reflection_Arraylist_Propertyinfo - Fatal编程技术网

C# Foreach更改属性。什么是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

我一直在阅读搜索MSDN帮助时提出的旧问题,但我无法真正理解PropertyInfo是什么,特别是与数组列表循环相关的问题

)

我上了一堂简单的课

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