2011-05-30 50 views
3

我正在做一些Odbc DataReader。在查詢結果中的每一行應該被改造成一個ResultObject看起來像這樣:委託給C#中的屬性

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), 
.... 
}; 

但是,我不知道如何從ResultType的財產創建PropMapper

問題:

我能在一個封裝/委託給一個給定類型的屬性的對象?

注:雖然奧姆斯對於這個非常有用的,我真的只要求C#如何允許創建委託(或任何等價物)

回答

0

你可能想看看進入一個小型的ORM像dapper

2

PropMapper將需要收到lambda expression作爲參數,表示屬性。 Prism的NotificationObject在其RaisePropertyChanged事件中收到這樣的表達式。

你可以看看Prism's source code如何使用lambda表達式來提取屬性並使用它。

+0

這樣的工作最好與重構。從lambda中,屬性名稱,getter和setter都可以確定。 – 2011-05-30 15:42:33

1

您可以嘗試使用反射:

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