2015-10-15 16 views
0

我有我的庫中的對象,如ObjA,ObjB,ObjC,ObjD ..泛型方法或繼承相似對象

我也有來自web服務的參考,SVCA,SvcB,SVCC,SVCD創建的對象。 。

需要注意的是,ObjA和SVCA是類似的,它們具有類似的領域(但不完全一樣的名字)

我有ObjA和SVCA映射下面的一段代碼。

public static SvcA[] GetSvcList (IList<libA> libList) 
{ 
    IList<SvcA> svcList = new List<SvcA>(); 
    foreach(libA libObj in libList) 
    { 
     svcList.Add(libA.getSvcObject()); 
    } 
    return svcList.ToArray(); 
} 

public static IList<ObjA> GetLibList(SvcA[] svcList) 
{ 
    IList<ObjA> objList = new List<ObjA>(); 
    foreach (SvcA svcObject in svcList) 
    { 
     objList.Add(new ObjA(svcObject)) 
    } 
} 

ObjA(SvcA svcObject) 
{ 
    this.Field1 = svcObject.Field1; 
    this.Field2 = svcObject.F2; 
} 

public static GetSvcObject() 
{ 
    SvcA a = new SvcA(); 
    a.Field1 = this.Field1; 
    a.F2 = this.Field2; 
} 

我無法修改Svc_類。但我可以修改Obj_類。如果我能做到這兩點,我想我可以從一個特定的對象派生出這兩個類並使用這些接口。

我想知道是否有可能避免重複SvcB-ObjB,SvcC-ObjC,SvcD-ObjD ..映射的所有代碼。

回答

0

在這裏,你可以將這些GetSvcListGetLibList轉換成通用的。以下是如何在不爲每種Obj和Svc複製它們的情況下實現的。

public static IList<Tobj> GetLibList<Tobj, Tsvc>(Tsvc[] svcList) where Tobj : new() 
{ 
    IList<Tobj> objList = new List<Tobj>(); 
    foreach (Tsvc svcObject in svcList) 
    { 
     objList.Add((Tobj)Activator.CreateInstance(typeof(Tobj), svcObject)); 
    } 

    return objList; 
} 

public static Tsvc[] GetSvcList<Tsvc, Tlib>(IList<Tlib> libList) 
{ 
    IList<Tsvc> svcList = new List<Tsvc>(); 
    foreach (Tlib libObj in libList) 
    { 
     // Check for null as GetMethod could throw null if method not found. 
     svcList.Add((Tsvc)(typeof(Tlib).GetMethod("getSvcObject").Invoke(libObj, null))); 
    } 

    return svcList.ToArray<Tsvc>(); 
} 

由於您沒有提供多少細節你的OBJ類,因此不能建議你有關的事情。但是,如果您具有相同的屬性,那麼Automapper可能是映射具有相同名稱的對象屬性的絕佳選擇。

+0

謝謝。對象具有不同的字段,因此不可能直接映射。我不確定automapper在這種情況下是否會非常有用。 我可以改爲定義getSvcObject和每個Lib類的構造函數,以便我可以使用上面的代碼創建列表。 T – Noel

+0

是!這是要走的路。 – vendettamit