2015-04-15 11 views
2

Я узнал от 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().

Редактировать: Обратите внимание: я не контролирую и не могу изменить C или I.

ответ

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

я, вероятно, может сделать что-то с отражением, но тип 'C' реализует несколько общие интерфейсы, и существуют различные перегруженные некоторые из методов, так что это не легко. – Rob