gpt4 book ai didi

c# - 通用直通接口(interface)。这可能吗?

转载 作者:行者123 更新时间:2023-11-30 13:58:34 24 4
gpt4 key购买 nike

我不会为这项工作付出什么:

public interface ICallBack
{
void Handle<T>(T arg);
}

public class MessageHandler : ICallBack
{
public void Handle<T>(T arg)
{
string name = typeof(T).Name;
Console.WriteLine(name);
}

public void Handle(int arg)
{
string name = "wow, an int";
Console.WriteLine(name);
}
}

public class Worker
{
public void DoSomething(ICallBack cb)
{
cb.Handle(55);
}
}

//...
Worker foo = new Worker();
ICallBack boo = new MessageHandler();

//I want this to print "Wow, an int"
foo.DoSomething(boo)

不幸的是,它调用的是通用入口点而不是“专用”入口点。好吧,这就是适合您的界面。

我也尝试过相同的方法,但用 Mojo 特定的通用签名替换了特定于 int 的签名:

public void Handle<T>(T arg) where T : Mojo {}

如果参数是 Mojo 类型,我希望这足以形成“特殊覆盖”。但是现在编译器提示我有两个具有相同签名的方法(一个是 Mojo 特定的,另一个是开放式的)。好吧,我实际上希望它会认为它是“相同的签名”,以便两者都能满足接口(interface),并在运行时选择“最佳”。嗯。

实际上,我正在尝试实现与“特征”隐约相似的“else-if-then of C++”。我想它也可以被认为是一种“接口(interface)签名逆变”的形式。

我很想发现有一个特殊的 C# 关键字可以启用此功能,或者它是 .net 4.5 中 C# 的一个特色补充。

是的,不是吗?评论?

最佳答案

不,这是不可能的。

当编译器编译实现接口(interface)的类型时,它会创建一个接口(interface)映射,详细说明该类型的哪些方法链接到接口(interface)的每个方法。这不能在运行时随意更改。

这意味着无论何时您通过该接口(interface)调用您的 Handle 方法,它总是会转到基础类型上的相同方法,而不管您认为应该更合适的任何其他方法。

如果你想让底层类型在内部调用特定的方法,取决于泛型参数的特定类型,你将不得不自己实现,要么使用动态调度,要么使用 if 语句或类似的检测类型的 T 并调用适当的方法。

这里的答案是说您可以将调用方法的类型强制转换为 dynamic,这意味着您正在使用反射来完全绕过接口(interface)。对于这个特定场景,接口(interface)可能根本没有任何方法,转换为 dynamic 仍然“有效”。

我不推荐这种方法。您实际上是在编写假设它可以全权访问基础类型的所有方法的代码,即使它明确表示“我只需要这个接口(interface)”。

此外,如果唯一的目标是避免运行时错误,请考虑如果您在类中显式实现该方法会发生什么:

void Main()
{
Worker foo = new Worker();
ICallBack boo = new MessageHandler();

foo.DoSomething(boo);
}

public interface ICallBack
{
void Handle<T>(T arg);
}

public class MessageHandler : ICallBack
{
void ICallBack.Handle<T>(T arg)
{
string name = typeof(T).Name;
Console.WriteLine(name);
}
}

public class Worker
{
public void DoSomething(ICallBack cb)
{
((dynamic)cb).Handle(55);
}
}

这会在运行时崩溃:

RuntimeBinderException:
'UserQuery.MessageHandler' does not contain a definition for 'Handle'

你可以在LINQPad中测试上面的代码.

关于c# - 通用直通接口(interface)。这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16464406/

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