2015-12-23 18 views
3

表示對象的n個SQL語句中的聯接返回多個建模對象中的結果,我想了一個辦法,他們模型和在一個對象

class JoinObjectsMapper 
    { 
     //add 2 fields one for the PK value and one for the name of the PK 


     internal readonly Dictionary<Type, object> Objs; 

     public JoinObjectsMapper(params object[] objs) 
     { 
      Objs = new Dictionary<Type, object>(); 
      foreach(var o in objs) 
      { 
       Objs[o.GetType()] = o; 
      } 
     } 

     public object this[Type key] 
     { 
      get { return Objs[key]; } 
      set { Objs[key] = key; } 
     } 

    } 

使用例子上來:

var custmer = new Customer { customer_id = 1, customer_name = "zxc" }; 
var order = new Order { order_id = 1, customer_id = 1, order_amount = 200.30m }; 
var mapper = new JoinObjectsMapper(custmer, order); 
var cus = mapper[typeof(Customer)] as Customer; 
var order = mapper[typeof(Order)] as Order; 

這是工作,除了我不喜歡的事實,我必須在檢索它後,對象,如果我使用泛型然後它不會工作的n個對象,除非我寫了這麼多重載據我所知。

任何想法如何找回我的對象​​作爲

var cus = mapper[typeof(Customer)]; 
var order = mapper[typeof(Order)]; 

或者

var cus = mapper.Ref<Customer>(); 
var order = mapper.Ref<Order>(); 

,仍然可以得到正確的類型,並避免鑄造?

+0

你不能。爲了避免強制轉換,您需要在編譯時瞭解對象的類型。 – phoog

+0

你不喜歡演員的運行時間影響,或不必寫出來? – James

+0

@詹姆斯不得不把它寫出來 – user1492051

回答

4

如果你只是不喜歡來執行轉換外部的JoinObjectsMapper的,你可以投添加到JoinObjectsMapper定義:

public T Ref<T>(){ 
    return (T)Objs[typeof(T)]; 
} 
+0

謝謝,我只是缺少演員(T)的一部分! – user1492051

3

另外一點需要注意捕捉異常。

public T Ref<T>(){ 
    if (!(Objs[typeof(T)] is T) 
     throw new InvalidCastException(); 

    return (T)Objs[typeof(T)]; 
} 
+0

我不認爲有可能有一個鍵的值不是鍵的類型。字典僅附加到使用'Objs [o.GetType()] = o;' – James

+0

@詹姆斯健康檢查? –

+0

@BenKnoble爲什麼拋出無效的強制轉換異常?如果該對象不能轉換爲該類型,則該轉換將拋出該異常。這就像說'返回分子== 0? 0:分子/分母;' – phoog