中的服務(,我不能改變)我有兩個對象類Bar
和Baz
與大多相似特性(但遺憾的是沒有,他們不會從同一派生的構造函數基類或來自同一界面...是啊繼承 - 啞),以及與它們相對BarQux
和BazQux
性能的相關性類:使擴展方法/包裝類通用
public class Bar public class Baz
{ {
public int ID { get; set; } public int ID { get; set; }
public bool Active { get; set; } public bool Active { get; set; }
public int BarQux { get; set; } public int BazQux { get; set; }
... ...
} }
public class Qux
{
public int ID { get; set; } // Corresponds to BarQux and BazQux
public string Name { get; set; }
}
在WPF屏幕,我綁定列表每種類型(Baz
和Bar
)到兩個獨立的ListViews。我需要每個人都有一個額外的Selected
CheckBox列。要做到這一點,我創建與公共屬性的包裝類,附加Selected
屬性,構造每個:
public class Foo
{
public Foo(Bar bar, Qux qux)
{
this.Active = bar.Active;
this.FooQux = string.Format("{0} - {1}", qux.ID, qux.Name);
...
}
public Foo(Baz baz, Qux qux)
{
this.Active = baz.Active;
this.FooQux = string.Format("{0} - {1}", qux.ID, qux.Name);
...
}
public bool Selected { get; set; }
public int ID { get; set; }
public bool Active { get; set; }
public string FooQux { get; set; }
...
}
要Baz
類和Bar
的每個集合轉換成的Foo
集合,我創建下面的擴展方法:
public static List<Foo> ToFoo(this IEnumerable<Bar> bars, IEnumerable<Qux> quxs)
{
List<Foo> foos = new List<Foo>();
foreach (Bar bar in bars)
{
Foo foo = new Foo(bar, quxs.Single(qux => qux.ID == bar.BarQux));
foos.Add(foo);
}
return foos;
}
public static List<Foo> ToFoo(this IEnumerable<Baz> bazs, IEnumerable<Qux> quxs)
{
List<Foo> foos = new List<Foo>();
foreach (Baz baz in bazs)
{
Foo foo = new Foo(baz, quxs.Single(qux => qux.ID == baz.BazQux));
foos.Add(foo);
}
return foos;
}
問:
如何讓我這個普通的?
理論,實施和錯誤:
由於構造函數是除了
Bar
和Baz
參數幾乎是相同的,我可以以某種方式使用泛型類型T
,使一個構造函數,仍然搶特性?public class Foo<T> { public Foo(T obj, Qux qux) { this.Active = obj.Active; // 'T' does not contain a definition for 'Active'... this.Qux = string.Format("{0} - {1}", qux.ID, qux.Name); ... } ... }
更改構造函數接收
Qux
對象的全部收集和做quxs.Single(qux => qux.ID == object.ObjectQux)
邏輯存在。然後將擴展方法變成一個通用方法,如下所示。public static List<Foo> ToFoo<T>(this IEnumerable<T> objCollection, IEnumerable<Qux> quxs) { List<Foo> foos = new List<Foo>(); foreach (T obj in objCollection) { Foo foo = new Foo(obj, quxs); // The best overloaded method... has some invalid arguments. foos.Add(foo); } return foos; }
1和2合起來了嗎?任何我沒有想到的事情?
你可能想看看這個https://en.wikipedia.org/wiki/Adapter_pattern – BlackBear
您無法修改該文件或無法修改該文件屁股?例如,你可以實現一個部分類。但是,你將不得不將原來的類改爲部分類。 –
@ScottNimrod我無法修改服務中的任何類或文件,例如'Bar','Baz'和'Type'類。如果我願意,我會很樂意讓前兩個從基類或接口繼承 - 這會讓我在有限的經驗中簡化事情變得更容易。 – OhBeWise