У меня есть методы:Как реорганизовать перегруженные методы
public MyReturnType MyMethod(Class1 arg)
{
//implementation
}
public MyReturnType MyMethod(Class2 arg)
{
//implementation
}
//...
public MyReturnType MyMethod(ClassN arg)
{
//implementation
}
десятичной, струнные, DateTime в [Class1, ..., 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