c# - 如何转换泛型参数?

标签 c#

这是我要写的内容:

public void Foo<T>(T parameter) {
  otherObject.Bar<T>(parameter);
}

Bar() 方法的签名是:

public void Bar<T>(T parameter) where T: class 

所以我得到一个编译错误,因为 Foo 签名中的 T 没有相同的约束。不幸的是我不会写:

public void Foo<T>(T parameter) where T: class {
  otherObject.Bar<T>(parameter);
}

因为 Foo 正在实现一个在外部接口(interface)中定义的方法。问题是:

我可以在调用 Bar 之前以某种方式在方法 Foo 中调换 T 吗? (注意,我可以肯定 T 总是一个类——我只需要通过编译器)。

我发现的唯一方法是使用反射,但我想知道我是否遗漏了一个更简单的技巧。

最佳答案

您可以使用 dynamic keyword像这样:

public void Foo<T>(T parameter)
{
    dynamic p = parameter

    otherObject.Bar(p);
}

发生的事情是在运行时解析对 otherObject.Bar 的调用,因为其中一个参数的类型为 dynamic。假设T是引用类型,则解析成功。

当然,这最终会使用反射(如您所指出的),但语法可能比您使用的要好。

当然,如果 T 不是类,这会给您一个运行时错误。

关于c# - 如何转换泛型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11436755/

相关文章:

c# - Owin startup.cs 中的 ModelBinders 注册

c# - 无法在运行时访问 SuppressMessage 属性

c# - 模块窗口中的 dll 符号状态显示 "Skipped Loading"?

c# - 如何在 C# 中使用 xsd?

C# 文化和 Java 语言环境不匹配

javascript - 无法使用 WATER 单击链接

c# - 为什么 DateTime.Parse 这么慢?

c# - 无法在 WPF 应用程序 C# VS2010 中使用 SendKeys

c# - 如何将标签或按钮准确地放置在表单的中间?

javascript - 显示所有字母拼贴可能性