Foreach изменить свойство. Что такое PropertyInfo?

Я читал старые вопросы, заданные при поиске справки 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. что такое PropertyInfo, который должен заменить «двойник» myProperry и что он представляет?


person AbeeCrombie    schedule 01.11.2012    source источник
comment
myProperty на самом деле не свойство... это поле; оно не будет отображаться в GetProperties   -  person Marc Gravell    schedule 01.11.2012


Ответы (3)


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

который будет намного быстрее, чем необработанное отражение, но при этом будет более гибким с точки зрения поиска имен свойств во время выполнения.

person Marc Gravell    schedule 01.11.2012
comment
спасибо марк. Я сжульничал, не используя get:set. это было большой проблемой, но я ценю объяснение! - person AbeeCrombie; 01.11.2012

Вы, вероятно, хотите этого:

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;
}
person Sjoerd    schedule 01.11.2012

GetProperties возвращает коллекцию объектов PropertyInfo.

Затем вам нужно выполнить итерацию (или поиск) в этой коллекции для нужного вам свойства.

См. здесь пример использования GetProperties()

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

person Matt    schedule 01.11.2012