首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据C# < 4中参数的运行时类型向方法分派?

如何根据C# < 4中参数的运行时类型向方法分派?
EN

Stack Overflow用户
提问于 2010-05-12 11:46:43
回答 5查看 899关注 0票数 5

我有一个对象o,它保证在运行时是ABC三种类型之一,所有这些类型都实现了公共接口I。我可以控制I,但不能控制ABC。(因此,我可以使用空标记接口,或者通过使用接口来利用类型中的相似之处,但不能添加新方法或更改类型中的现有方法。)

我还有一系列方法MethodAMethodBMethodC。查找o的运行时类型,然后将其用作这些方法的参数。

代码语言:javascript
运行
复制
public void MethodA(A a) { ... }
public void MethodB(B b) { ... }
public void MethodC(C c) { ... }

使用此策略,现在必须对o类型执行检查,以确定应该调用哪个方法。相反,我只想有三个重载的方法:

代码语言:javascript
运行
复制
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)

  • void Method(B)

  • void方法(C)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-12 11:56:01

像这样的怎么样?

代码语言:javascript
运行
复制
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);
}
票数 5
EN

Stack Overflow用户

发布于 2010-05-12 11:56:53

如果可以重构,请将方法移动到接口,并让每个类都有其实现:

代码语言:javascript
运行
复制
I i = o as I;
i.Method();
票数 7
EN

Stack Overflow用户

发布于 2010-05-12 11:51:45

如果3类A、B和C实现接口i,则不应该做任何操作。正是运行时为您选择了正确的方法:

代码语言:javascript
运行
复制
A a = new A();
class.Method(a); // will calll Method(A a)

B b = new B();
class.Method(b); // will call Method(B b)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2818436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档