c# - 动态和显式通用接口(interface)实现

标签 c# generics dynamic explicit-interface

我从here中学到了动态变量不能访问它们显式实现的接口(interface)上的方法。当我在编译时不知道类型参数 T 时,有没有一种简单的方法来调用接口(interface)方法?

interface I<T>
{
    void Method1(T t);
}

class C<T> : I<T>   
{   
    void I<T>.Method1(T t) 
    { 
        Console.WriteLine(t);
    }
}

static void DoMethod1<T>(I<T> i, T t)
{
    i.Method1(t);
}

void Main()
{
    I<int> i = new C<int>();
    dynamic x = i;
    DoMethod1(x, 1);              //This works
    ((I<int>)x).Method1(2);       //As does this
    x.Method1(3);                 //This does not
}      

我不知道类型参数 T,所以(据我所知)我无法转换我的动态变量 x。我在接口(interface)中有很多方法,所以真的不想创建相应的 DoXXX() 传递方法。

编辑:请注意,我不控制也无法更改 CI

最佳答案

你可以通过反射来做到这一点:

I<int> i = new C<int>();
dynamic x = i; // you dont have to use dynamic. object will work as well.
var methodInfo = x.GetType().GetInterfaces()[0].GetMethod("Method1");
methodInfo.Invoke(x, new object[] { 3 });

关于c# - 动态和显式通用接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654843/

相关文章:

c# - 如何在 C# 反序列化期间进行引用修复?

java - 为什么泛型类型参数在 Java 中不能有下限?

c# - 如何将任务存储在字典中以便稍后在 C# 中执行

dynamic - 如何编译具有动态代码的脚本?

javascript - 如何通过javascript动态更改链接?

c# - Lambda 表达式练习

c# - 如何在不使用 Subjects 或 .NET 事件的情况下创建在方法调用时发出的 IObservable?

c# - Visual Studio 2015 RC Entity Framework 6.1.3 迁移错误

具有类和接口(interface)的 Java 泛型 - 一起使用

generics - 在 .NET Core 中使用字段名动态构建 IQueryable Select 子句