- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我有三种方法:
void Foo(MemoryStream v) {Console.WriteLine ("MemoryStream");}
void Foo(Stream v) {Console.WriteLine ("Stream");}
void Foo(object v) {Console.WriteLine ("object");}
我调用方法 Foo
传递开放泛型类型的第一个参数:
void Bar<T>()
{
Foo(default(T)); //just to show the scenario
//default(T) or new T() doesn't make a difference, null is irrelevant here
}
我想调用 MemoryStream
重载,所以我用 MemoryStream
关闭泛型方法 Bar
:
Bar<MemoryStream>();
但是 object
重载被调用了。如果我将通用约束添加到 Foo 签名 where T : Stream
,则调用 Stream
版本。
有没有办法根据开放的通用类型 T
将方法调用分派(dispatch)到 MemoryStream
重载?
我不想使用 Delegate.CreateDelegate
或其他反射 API。只是以C#语言的方式。我可能在语言本身中遗漏了一些东西。
尝试将值类型作为封闭泛型类型并使用静态方法来尝试这种情况。
最佳答案
您所描述的称为“模板特化”,在 C# 中不起作用。它在 C++ 中可用,但仍未进入 C#。
这已在“C# generic interface specialization”中得到解答。简短的版本是你做不到。您可以解决它强制执行运行时解析,但在这种情况下使用泛型是没有意义的。泛型应该用于在不同类型上使用相同的代码。
也许还有另一种方法可以做您真正想做的事情。在实现策略或模板方法模式时,我遇到过类似的情况,我希望大部分代码在一般情况下都能正常工作,但修改一些特定步骤。
在这种情况下,当您实际创建“模板方法”时,最好将自定义步骤作为接口(interface)注入(inject)到您的类中,或者甚至是专门化该行为的 Func<> 对象。
当然,还有很多其他方法可以做到这一点,对于特定问题,其中一些方法比其他方法效果更好
关于c# - 如何调用基于封闭泛型的方法重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19491928/
我是一名优秀的程序员,十分优秀!