- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不会为这项工作付出什么:
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/
将 SQL Passthrough 工具与 SAS 一起使用是否有任何优势? 最佳答案 虽然这个问题过于宽泛,但我可以提供一个过于宽泛的答案。 SAS 中的直通 SQL 允许您直接与数据库通信。当您使
我最近一直在使用 nginxdemo/nginx-ingress Controller 。 据我了解,该 Controller 无法执行 SSL Passthrough(我的意思是将客户端证书一直传递
我正在使用 Virtual Box USB 直通功能将串口连接到 Ubuntu (/dev/ttyUSB0)。此端口用于与 3dm-gx2 IMU 通信.相同的端口适用于供应商提供的 Windows
我有一个使用客户端身份验证的 Web 应用程序,它可以正常工作。 我的问题:网络应用程序需要与第 3 方 RESTful 服务交互。 Kicker:该服务需要使用 Web 应用程序正在使用的相同证书进
CSS: ol { margin: 0 30px; } li { margin: 15px 0; } li.done { text-de
我想从 DB2 中检索与 DB1 表中的标识符匹配的记录列表,就像常规 SAS 子查询一样。如何使用 SAS 直通 SQL 执行此操作? 使用常规 SAS SQL 在 db1 上执行(长而复杂的)SQ
我创建了一个简单的 (asmx) Web 服务,它返回一个数据集。我已使用“数据”->“来自 Web”按钮将 Web 服务添加到我的 Excel 2007 工作簿中,并且可以查看/刷新数据。 当我需要
我正在写一个画廊领域。该字段是ManyToManyField的子类,并添加了自己的ajax小部件和内容。我想使该解决方案尽可能紧凑(我的意思是-我想写尽可能少的代码,以便在其他项目中重新实现)。 我决
我想做一个使用 SSL/TLS 的协议(protocol)分析幸运的是我可以安装我自己的证书并且 DNS 部分不会成为问题。我的问题是我用什么来做到这一点。我考虑过使用 paros 但它会比它的值(v
我已经设置了一个 Nginx Ingress 来代理流量到我使用 kubeadm 设置的 Kubernetes 集群。这似乎运作良好。 在主机上(设置主节点的地方)我有许多其他服务正在运行,这些服务正
我有一个隐式 Intent 过滤器,它通过打开 Intent 来使用默认 Web 浏览器查看来处理 magnet: 方案链接。目前,这具有单击磁力链接将用户从浏览器抛出到我的 Activity 中的效
我在虚拟机 (libvirt/qemu) 中有一个 MacOS Catalina,主机是 Fedora 31。我想通过 iPhone SE 进行 iOS 开发。当我连接 iPhone 时,我在 dme
我正在通过 helm 在 minikube 中运行 nginx 入口 Controller ,通过查看 nginx 入口 Controller pod 的日志,我可以看到 Controller 中启用
关闭。 这个问题是 off-topic 。它目前不接受答案。 想改进这个问题吗? Update the question 所以它是 Stack Overflow 的 on-topic。 关闭 10
我需要将 SSL 连接直接发送到后端,而不是在我的 Traefik 上解密。后端需要接收https请求。 我尝试了 traefik.frontend.passTLSCert=true 选项,但是当我访
我想创建一个自定义控件来简化以下代码: First Name Last Name 我的想
这就是问题。 我有一个 https 请求。该请求作为 SSL/TLS 请求发送(不是来自具有代理设置的浏览器的 CONNECT ....)。 我需要用 C# 编写一个代理来阻止特定的 https://
如何在通过 SSL 的同时为多个域、多个后端设置 HAproxy? 图表中的示例以获得更好的解释: backend_domain_a dom
我正在尝试确保客户端和我的后端服务器之间的完整 e2e 连接。这就是我当前的基础架构的样子: Fargate 集群,我的后端应用程序放置在私有(private)子网中。 它们前面是内部网络负载均衡器,
默认情况下映射到 gt 命令,它选择下一个选项卡。我想传递给 Crtl+Tab 插件,它为标签做 MRU。 任何的想法? 最佳答案 由于您要传递,请使用: :map i 关于plugins - 默认
我是一名优秀的程序员,十分优秀!