首先要注意 - 我知道代表和裝飾圖案!班級延伸 - 最佳做法/最佳解決方案
第二 - 我正在使用C#.NET 4.0,所以如果你想出一個特定的解決方案,那很好。但如果解決方案適用於任何OOP語言和平臺,那就太好了。
而且這裏的問題去...
我有一個分部類(允許其命名爲Class1
),我不能修改。因此,我可以擴展它或/並從中繼承。這個類爲我提供了一個完美的數據模型,我唯一需要的是爲它的屬性添加一些屬性(用於驗證,在MVC等中定義標籤文本值 - 現在,我不需要像'你可以做什麼需要沒有屬性「,這不是我的問題)。
使用另一個類作爲數據模型不是問題,所以我可以創建Class2 : Class1
並使用Class2
作爲模型。需要屬性的屬性將被定義爲public new <type> <propertyname>
。這將限制我只重寫需要屬性的屬性,而不會改變所有其他屬性。
較小的問題是,我不怎樣重新定義getter和setter屬性,因爲他們所要包含的return base.<propertyname>
和base.<propertyname> = value
,如果有大量的這種特性,這意味着大量的「笨」的編碼。有沒有辦法避免這種情況?
更大的問題是,我有我的參數化與Class2
例如Class1
和製造類似class2.<propertyname> = class1.<propertyname>
每個單一的財產我有 - 太多的「笨」的編碼。我可以使用反射來避免它 - 在公共獲取者和設置者中找到所有屬性,在Class1
中,並在循環中調用prop.SetValue(child, prop.GetValue(parent, null), null);
。這爲簡單的情況提供了一個通用的功能,這很好,因爲我大多數都有簡單的模型 - 大量的公有getter和setter沒有body和另一個邏輯的屬性。但我想要更通用的解決方案,而且我不喜歡反思。有任何想法嗎?
這裏去創建Class2
基礎上Class1
public static Child ToExtendedChild<Parent, Child>(this Parent parent)
where Child : Parent, new()
{
Child child = new Child();
var props = typeof(Parent).GetProperties().Where(p => p.GetAccessors().Count() >= 2);
foreach (var prop in props)
{
prop.SetValue(child, prop.GetValue(parent, null), null);
}
return child;
}
擴展方法的完整代碼(順便說一下,這種方法可能不理想實現我的解決方案,所以任何糾正可能還可以理解的)
提前致謝!
我必須重新定義getters和setter,因爲我正在製作屬性'new',並且複製構造函數只是寫了很多行的另一種變體,如'property = property' – 2010-09-06 07:42:05
並感謝AutoMapper - 這很有趣,雖然我不確定我想導入第三方解決方案來解決這個小問題。 – 2010-09-06 07:50:20