我所有的类都实现了一个接口IPrettyPrint。使用扩展方法,我可以将PrettyPrint方法添加到双精度(List<T>
,...),但是有没有可能双倍支持IPrettyPrint?任何喜欢使用PrettyPrint方法的人都只能依靠IPrettyPrint。扩展方法和接口
Q
扩展方法和接口
1
A
回答
3
不,除非您使用允许“鸭子打字”的图书馆。即使如此,如果该方法仅在扩展方法中实现,我认为你会很困难。
不要被扩展方法愚弄 - 你不向类型本身添加任何东西,它们只提供“语法糖”,然后由编译器解释。
1
扩展方法是一种编译器功能,而不是运行时功能 - 它们模拟您将方法添加到Type
,但是如果您反编译代码,您会发现它实际上并没有做任何这样的事情(.NET使用静态/闭式系统,所以实际的方法添加到类型的唯一方法是从类型继承和方法添加到您的新型)
因此,技术上,double
从不支持IPrettyPrint
- - 编译器只是假装它。
0
可以使用反射来模拟鸭子打字 - 如果类型支持操作(即,定义了您正在查找的方法),那么它隐含地是该界面(即使您从未这样做过),以及你应该叫它。否则,它不!
问题是,C#反射有点慢,在大多数情况下会浪费你的时间。示例代码如下:
public static object To(this string value, Type t) {
object obj;
// This is evil, I know, but is the most useful way to extend this method
// without having an interface.
try {
MethodInfo method = t.GetMethod("Parse", BindingFlags.Static | BindingFlags.Public,
null, new Type[] { typeof(string) }, null);
Preconditions.Check(method.ReturnType == t, "The return type doesn't match!");
obj = method.Invoke(null, new object[]{value});
} catch (Exception e) {
throw new CoercionException("I can't coerce " + value + " into a " + t.Name + "!", e);
}
return obj;
}
对于那些喜欢stats的人,当需要反射时,该方法的查找接近于无。然而,方法的调用:
obj = method.Invoke(null, new object[]{value});
是一个性能猪,大约需要4-5ms执行。
相关问题
- 1. 扩展方法到接口
- 2. 接口的扩展方法
- 3. 实现扩展方法接口C#
- 4. 模拟扩展方法作为接口
- 5. 通用扩展方法:接口
- 6. 扩展方法,返回接口类型
- 7. 扩展方法不适用于接口
- 8. 接口的扩展方法;代表
- 9. 接口扩展 - 基类或扩展方法
- 10. 扩展和实现接口
- 11. 扩展接口
- 12. 扩展接口
- 13. 使用泛型和扩展方法的IDescription接口
- 14. 接口扩展TimerTask
- 15. 如何扩展扩展类的接口
- 16. C#,WinForms和扩展方法
- 17. EF和LINQ扩展方法
- 18. F#和PLINQ扩展方法
- 19. 扩展方法和继承
- 20. ZF2无法从接口扩展AbstractActionController
- 21. 扩展方法和方法覆盖
- 22. AS3/Flex:接口扩展接口
- 23. 接口扩展接口属性
- 24. 扩展接口的方法为什么在实现扩展接口的类中不可见?
- 25. 扩展方法
- 26. 扩展方法
- 27. 扩展Iterable的Haxe接口
- 28. C#类型扩展接口
- 29. GWT扩展常量接口
- 30. Java接口扩展问题