2011-10-27 69 views
1

也許這個問題,總是在這個論壇上問,但我沒有找到我需要的。 我的問題是我有這樣使用反射和ValueInjecter映射覆合對象

class Customer 
{ 
    private int Id { set; get; } 
    private int Name { set; get; } 
    private Company Company { set; get; } 
    ... 
} 

class Company 
{ 
    private int Id { set; get; } 
    private string Name { set; get; } 
    ... 
} 

複合類當我的客戶數據

string sql = "SELECT cust.id, cust.name, comp.name AS [CompanyName] FROM Customer cust INNER JOIN Company comp ON cust.Company = comp.Id"; 
.... 
using (IDataReader dr = db.ExecuteReader(cmd)) 
{ 
    if (dr.Read()) 
    { 
     customer = (Customer)FillDataRecord(dr, customer); 
    } 
} 

,並使用反射它映射到客戶類(對象),代碼:

public static Object FillDataRecord(IDataRecord dr, Object obj) 
{ 
    try 
    { 
     Type type = obj.GetType(); 
     PropertyInfo[] properties = type.GetProperties(); 

     for (int i = 0; i < dr.FieldCount; i++) 
     { 
      if (!dr[i].ToString().Equals(string.Empty)) 
      { 
       type.GetProperty(dr.GetName(i)).SetValue(obj, dr[i], null); 
      } 
     } 

     return obj; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

當它映射公司名稱時,它將返回錯誤「未將對象引用設置爲對象的實例」。我已經調試過,並且知道這個問題,但直到現在,我無法解決它。

我知道AutoMapper或Dapper,但是當我適用於這種情況時,我也遇到了同樣的問題。

現在我正在使用ValueInjecter,從我讀過的它可以解決我的問題。 但我有cust.Id值相同與cust.Company.Id和cust.Name = 「」 和cust.Company.Name = 「」

string sql = "select cust.id, cust.name, comp.name from customer cust inner join company comp on cust.company = comp.id"; 

while (dr.Read()) 
{ 
    var cust = new Customer(); 
    cust.InjectFrom<ReaderInjection>(dr); 

    cust.Company = new Company(); 
    cust.Company.InjectFrom<ReaderInjection>(dr); 

    list.add(cust); 
} 

這有什麼錯?請幫幫我。

回答

2

爲什麼使用Object?爲什麼不把它變成通用的?像這樣:

public static T FillDataRecord<T>(IDataRecord dr) where T : new() 
{ 
    T returnedInstance = new T(); 
    string fieldName = default(string); 

    try 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(); 

     fieldName = dr.GetName(i); 

     foreach (PropertyInfo property in properties) 
     { 
      if (property.Name == fieldName) 
      { 
       // Handle the DBNull conversion issue.. 
       if (dr.GetValue(i) == DBNull.Value) 
        property.SetValue(returnedInstance, null, null); 
       else 
        property.SetValue(returnedInstance, dr[i], null); 
      } 
     } 

     return returnedInstance; 
    } 
    catch (Exception ex) 
    { 
     // Handle exception here 
    } 
} 

然後,你可以這樣做:

Customer _customer = FillDataRecord<Customer>(dr); 

或者,這樣的:

CustomerDetails _customerDetails = FillDataRecord<CustomerDetails>(dr); 

在回答你的問題。如果那裏有從拉空的可能性數據庫..你必須檢查它。

+0

我對Generic知之甚少,在完成之後我會改進它。感謝您的改善,但我有錯誤,因爲變量我沒有在你的代碼中聲明,並且是字段名類型的字符串? – Willy

+0

我很抱歉,是的,fieldName是一個字符串。 – chemicalNova

+0

沒關係,但是我在record.GetName(i),record.GetValue(i)和記錄[i]呢?你還沒有定義它 – Willy