gpt4 book ai didi

c# - 如何调用基于封闭泛型的方法重载?

转载 作者:可可西里 更新时间:2023-11-01 08:19:08 26 4
gpt4 key购买 nike

假设我有三种方法:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com