J'ai les méthodes:Comment refactoriser méthodes surchargées
public MyReturnType MyMethod(Class1 arg)
{
//implementation
}
public MyReturnType MyMethod(Class2 arg)
{
//implementation
}
//...
public MyReturnType MyMethod(ClassN arg)
{
//implementation
}
décimal, chaîne, DateTime dans [Class1, ..., ClassN]
et une méthode commune:
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.
}
Comment puis-je refactoriser ce code? Je peux utiliser des attributs et le modèle de composant, quelque chose comme ceci:
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());
}
mais cela semble assez difficile à comprendre et peut créer des bugs. Par exemple, si quelqu'un déclare méthode comme
[MyAttribute(Type = ClassNplus1)]
public NotMyReturnType MyMethod(ClassNplus1 arg);
D'autres idées comment créer un système extensible, où l'ajout de nouvelles classe est nécessaire que d'ajouter une méthode? (Ajouter du code dans un endroit)
Oui, cela ressemble à ce que je recherche, mais je peux utiliser le framework 3.5. Est-il possible de le simuler? merci pour le lien. – Steck
Je n'ai pas implémenté ce modèle moi-même mais lorsque je parle à des collègues, il est courant d'utiliser le modèle de répartition double. Il est décrit ici -> http://www.garyshort.org/blog/archive/2008/02/11/double-dispatch-pattern.aspx. Espérons que cela aide – mattythomas2000