Делегирование свойств в C # - PullRequest
3 голосов
/ 30 мая 2011

Я что-то делаю с Odbc DataReader. Каждая строка в результате запроса должна быть преобразована в ResultObject, похожую на это:

struct ResultObject {
    public int Prop1 { get; set; }
    public string Prop2 { get; set; }
    ...
}

Чтобы написать больше кода для конкретного домена, я хочу преобразовать этот код

var query = "SELECT Prop1, Prop2, ... FROM MyTable;";
... connect, submit query
while( reader.Read() ) {
  var fieldValue = fields[ fieldindex ];
  switch( fieldindex ) {
     case( indexProp1 ): result.Prop1.Set( (int) fieldValue); break;
     case( indexProp2 ): result.Prop2.Set( (string) fieldvalue); break;
     ...
  }
}

в нечто более общее, где я динамически строю отображение между индексами и «сеттерами»:

Но было бы неплохо иметь что-то еще более лаконичное, например:

PropMapper mappers[] = {
 new PropMapper("Prop1", ResultType.Prop1 ),
 new PropMapper("Prop2", ResultType.Prop2 ),
 ....
};

Однако я понятия не имею, как создать PropMapper из свойства ResultType.

Вопрос:

Как я могу сгенерировать объект, который переносит / делегирует свойство данного типа?

Примечание: хотя ORM довольно полезны для этого, я на самом деле спрашиваю только, как C # позволяет создавать делегат (или что-нибудь эквивалентное)

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

PropMapper должен будет получить лямбда-выражение в качестве параметра, представляющего свойство. Prism *1003* NotificationObject получает такое выражение в своем событии RaisePropertyChanged.

Вы можете посмотреть Исходный код Prism , как используется лямбда-выражение для извлечения свойства и использованияэто.

1 голос
/ 30 мая 2011

Вы можете попробовать использовать Reflection:

PropertyInfo[] props = new PropertyInfo[]
{
  typeof(ResultObject).GetProperty("prop1"),
  typeof(ResultObject).GetProperty("prop2"),
};

for (int i = 0; i < props.Length; i++)
{
  props[i].SetValue(result, fieldValue, null);
}
0 голосов
/ 30 мая 2011

Возможно, вы захотите взглянуть на мини-орму, например dapper

...