动态和显式通用接口实现

时间:2015-04-15 15:46:49

标签: c# generics dynamic explicit-interface

我从here了解到,动态变量无法访问它们明确实现的接口上的方法。当我在编译时不知道类型参数T时,是否有一种简单的方法可以调用接口方法?

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。我在界面中有很多方法,所以不要真的想要创建相应的DoXXX()传递方法。

修改:请注意,我无法控制,无法更改CI

1 个答案:

答案 0 :(得分:0)

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

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 });