我有一个对象o,它保证在运行时是A、B或C三种类型之一,所有这些类型都实现了公共接口I。我可以控制I,但不能控制A、B或C。(因此,我可以使用空标记接口,或者通过使用接口来利用类型中的相似之处,但不能添加新方法或更改类型中的现有方法。)
我还有一系列方法MethodA、MethodB和MethodC。查找o的运行时类型,然后将其用作这些方法的参数。
public void MethodA(A a) { ... }
public void MethodB(B b) { ... }
public void MethodC(C c) { ... }使用此策略,现在必须对o类型执行检查,以确定应该调用哪个方法。相反,我只想有三个重载的方法:
public void Method(A a) { ... } // these are all overloads of each other
public void Method(B b) { ... }
public void Method(C c) { ... }现在,我让C#来执行分派,而不是自己手动执行。这能办到吗?当然,天真直截了当的方法是行不通的:
无法解析方法“方法(对象)”。候选人是:
Method(A)
发布于 2010-05-12 11:56:01
像这样的怎么样?
private Dictionary<Type, Action<I>> _mapping = new Dictionary<Type, Action<I>>
{
{ typeof(A), i => MethodA(i as A)},
{ typeof(B), i => MethodB(i as B)},
{ typeof(C), i => MethodC(i as C)},
};
private void ExecuteBasedOnType(object value)
{
if(_mapping.ContainsKey(value.GetType()))
_mapping(value.GetType())(value as I);
}发布于 2010-05-12 11:56:53
如果可以重构,请将方法移动到接口,并让每个类都有其实现:
I i = o as I;
i.Method();发布于 2010-05-12 11:51:45
如果3类A、B和C实现接口i,则不应该做任何操作。正是运行时为您选择了正确的方法:
A a = new A();
class.Method(a); // will calll Method(A a)
B b = new B();
class.Method(b); // will call Method(B b)https://stackoverflow.com/questions/2818436
复制相似问题