Передача свойства в метод для изменения этого свойства - PullRequest
5 голосов
/ 25 июня 2010

Не уверен, что это возможно, но вот что я пытаюсь сделать:

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

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

Мой код конечного результата будет выглядеть так:

for(int index = 0; index < fields.Length)
{
    fieldPropertyMapping[index] = StripQuotes(fields[index]);
}

Ответы [ 3 ]

6 голосов
/ 25 июня 2010

Чтобы сделать то, что вы просите, вам нужно использовать рефлексию (как вы отметили свой вопрос), чтобы сделать это. Взгляните на класс PropertyInfo. Я не совсем уверен, что делает ваш код, но общий пример рефлективной установки значения свойства будет:

object targetInstance = ...; // your target instance

PropertyInfo prop = targetInstance.GetType().GetProperty(propertyName);

prop.SetValue(targetInstance, null, newValue);

Однако вы могли бы вместо этого передать Action<T>, если вы знаете свойство в какой-то момент кода. Например:

YourType targetInstance = ...;

Action<PropertyType> prop = value => targetInstance.PropertyName = value;

... // in your consuming code

prop(newValue);

Или, если вы знаете тип при вызове, но у вас нет экземпляра, вы можете сделать его Action<YourType, PropertyType>. Это также предотвратит создание замыкания.

Action<YourType, PropertyType> prop = (instance, value) => instance.PropertyName = value;

... // in your consuming code

prop(instance, newValue);

Чтобы сделать это полностью универсальным («универсальным», как в «неспецифическом», а не как в универсальном), вам, вероятно, придется сделать его Action<object> и привести его к соответствующему типу свойства в лямбде, но это должно работать в любом случае.

2 голосов
/ 25 июня 2010

У вас есть несколько вариантов:

  1. Используйте отражение. Сохраните и передайте объект PropertyInfo в метод и установите его значение с помощью отражения.
  2. Создайте ActionDelegate с закрытием для этого свойства и передайте его в метод.
0 голосов
/ 25 июня 2010

Вы можете использовать отражение, чтобы получить свойства для класса:

var properties = obj.GetType().GetProperties();

foreach (var property in properties)
{
  //read / write the property, here... do whatever you need
}
...