我有两个接口IDto1和IDto2。 IDto2继承IDto1。这两个接口都是针对DTO的,因此我希望将“复杂”代码保留在其实现之外 - 我通过在每个接口的静态类中放置一个扩展方法 Initialize 来实现这一点。
所以我最终得到以下类型IDto1,IDto2,IDto1Extensions,IDto2Extensions。
我希望在两个接口上都有 Initialize 扩展方法,但每个接口都有不同的实现。
在客户端代码中,我想使用这样的代码:
(dto as IDto1).Initialize();
...我希望在运行时根据dto变量的已解析类型调用相关的扩展方法。
这可能在C#中,如果不是,为什么不呢?
修改
很抱歉,当然:
(dto as IDto1).Initialize();
...将在 IDto1 类型上调用 Initialize 方法。我的意思是 dto 变量将作为参数传递给方法,在这种情况下,我相信在给定我之前指定的继承层次结构的情况下,将多态地选择该方法。
感谢您的所有答案。
答案 0 :(得分:4)
你在这里想要实现的是某种多态性。扩展方法是静态方法。在OOP中,polymorphysm仅适用于实例方法。
一个选项可能是切换到抽象类。
答案 1 :(得分:4)
看看你的陈述:
(dto as IDto1).Initialize();
...我希望在运行时根据dto变量的已解析类型调用相关的扩展方法。
括号中的“已解析类型”正好 IDto1
。它不能是其他任何东西,所以编译器将使用它。实际上变量永远不会改变类型(我假设你的意思是对象由变量的值引用)。
在.NET 4.0 / C#4.0中,鸭子类型的选项可能是实例方法而且dynamic
...
((dynamic)dto).Initialize();
...但说实话,我不明白为什么你不能只是将你的Initialize
方法添加到界面并使用多态,因为这听起来最接近你想要描述的内容。 / p>
答案 2 :(得分:3)
您要完成的任务是不可能的,因为扩展方法在编译时被解析,而在您的情况下,dto
变量的实际类型仅在运行时才知道。
答案 3 :(得分:1)
如果你想让你的代码更动态,你可以在配置文件中定义你想要的类,并使用类似的东西
String className = ConfigurationManager.AppSettings["Interface"].ToString();
IDto1 dto = (IDto1)Activator.CreateInstance(Type.GetType(className));
在这个示例中,我使用第一行来获取类名。
第二行创建Object的实例。
Guilherme Ferreira http://guilhermeferreira.wordpress.com/
答案 4 :(得分:0)
这听起来像是抽象基类的工作。