我的方法:如何重構重載方法
public MyReturnType MyMethod(Class1 arg)
{
//implementation
}
public MyReturnType MyMethod(Class2 arg)
{
//implementation
}
//...
public MyReturnType MyMethod(ClassN arg)
{
//implementation
}
十進制數,字符串,日期時間在[1類,...,ClassN]
和一個常用的方法:
public MyReturnType MyMethod(object obj)
{
if(obj == null)
throw new ArgumentNullException("obj");
if(obj is MyClass1)
return MyMethod((Class1)obj);
if(obj is MyClass2)
return MyMethod((Class2)obj);
//...
if(obj is MyClassN)
return MyMethod((ClassN)obj);
return MyMethod(obj.ToString()); //MyMethod(string) implemented.
}
如何我可以重構這段代碼嗎?我可以使用屬性和組件模型,像這樣:
public class MyAttribute : Attribute
{
public Type Type { get; set; }
}
public MyReturnType MyMethod(object obj)
{
if(obj == null)
throw new ArgumentNullException("obj");
var protperty = TypeDescriptor.GetProperties(this, new Attribute[] { new MyAttribute() })
.Cast<PropertyDescriptor>().FirstOrDefault(x =>
x.GetAttribute<MyAttribute>().Type.IsInstanceOfType(obj));
if (protperty != null)
return protperty.GetValue(obj) as MyReturnType;
return MyMethod(obj.ToString());
}
但它看起來很難理解,並且可能會產生一些錯誤。例如,如果有人宣稱像
[MyAttribute(Type = ClassNplus1)]
public NotMyReturnType MyMethod(ClassNplus1 arg);
任何其他的想法如何創建可擴展的系統,在增加新的類只需要添加一個方法的方法? (在一個地方添加代碼)
是的,這看起來像我在找什麼,但我可以使用3.5框架。有沒有可能模擬它? 感謝您的鏈接。 – Steck
我自己並沒有實現這個模式,但是當與同事聊天時,常常會使用雙重調度模式。這裏描述 - > http://www.garyshort.org/blog/archive/2008/02/11/double-dispatch-pattern.aspx。希望這有助於 – mattythomas2000