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
myProperty
на самом деле не свойство... это поле; оно не будет отображаться вGetProperties
- person Marc Gravell   schedule 01.11.2012