2016-12-29 74 views
0

這是我正在看的。假設我有一個具有多個屬性的類。我試圖寫一個看起來像這樣如何編寫使用屬性名稱填充屬性的方法?

 public static void GetNullableInt32(this DbDataReader reader, Type property) 
     { 
      property = reader.IsDBNull(reader.GetOrdinal(property.name)) 
         ? (int?)null 
         : reader.GetInt32(reader.GetOrdinal(property.name)); 

     } 

凡屬性名稱都是從反射拉的方法,並且屬性是在方法中設置。我把Type中的參數作爲佔位符來放入它需要的任何類型。然後我會這樣稱呼它:

 reader.GetNullableInt32(Class.Property1); 

從數據庫讀取器設置類的所有屬性。

有沒有簡單的方法來做到這一點?或者是否有更好的結構,而不必將字段名稱作爲字符串輸入,而是從列名稱中提取?

編輯

在回答刪除評論問,爲什麼我們不只是傳遞的字符串名稱,使用的代碼看起來像

  Class item = new Class { 
       ContactRelationId = reader.IsDBNull(reader.GetOrdinal("ContactRelationId")) 
        ? (int?)null 
        : reader.GetInt32(reader.GetOrdinal("ContactRelationId"))} 

而流傳下來的是要求我們不應該將包過程存儲爲字符串。

回答

1

您需要通過具有該屬性的對象的實例來發送,該對象將獲取該屬性。如果你的類看起來像:

public class MyClass 
{ 
    public int? MyInt { get; set; } 
} 

你必須實例發送到這個方法:

public static void GetNullableInt32(this DbDataReader reader, MyClass instance, string propName) 

但是,爲什麼使用反射,當你不就得了?速度較慢,通常會導致錯誤。只要做到在調用方法分配:

public static void GetNullableInt32(this DbDataReader reader, string propName) 
{ 
    //... 
} 

//calling method 
myClassInstance.MyInt = reader.GetNullableInt32(nameof(MyClass.MyInt)); 

這一切都假定你的列名和屬性名相同,你似乎已經指定他們。

相關問題