2013-09-23 1 views
4

Я вызываю метод типа с помощью отражения, который принимает несколько параметров:Как вызвать метод, который возвращает интерфейс

var myType = typeof(myClass); 

var myMethod = myType.GetMethod("myMethodInClass", 
           new[] { typeof(string), typeof(string) }); 

myMethod.Invoke(?, new object[] { "", "" }); 

Я хочу цели быть IDataReader, который является то, что методом вернется, но я, очевидно, не могу создать экземпляр нового интерфейса.

+1

Просто передайте объект и бросьте его впоследствии. – Mansfield

+1

обычно отличает возвращаемое значение к вашему интерфейсу, например '(IYourInterface) myMethod.Invoke ...' –

+0

Как все говорят, вы должны создать объект, реализующий интерфейс, а затем бросить его. Возможно, вы захотите изучить [Ninject] (http://www.ninject.org/). Инъекция зависимостей может быть только то, что вам нужно – Icemanind

ответ

1

Куда вы разместили ? в вопросе не должно быть IDataReader, но экземпляр myClass. Вы передаете объект, по которому вы хотите вызывать myMethod.

Результатом вызова .Invoke() будет IDataReader, но это не то, что вы создаете; он создается внутри метода, который вы вызываете.

+0

'тот же экземпляр, который вы использовали выше' нет, 'myType' - это объект, описывающий тип, который имеет тип' Type' и 'myClass' - это имя типа. 'typeof' не может использоваться с именем переменной –

2

Вы не можете вернуть интерфейс, но вы можете вернуть экземпляр класса, реализующего интерфейс, возвращаемый вашим методом. Просто брось.

IDataReader implemented = new YourClass(); // or any other constructor 

Ваш класс должен реализовывать только интерфейс IDataReader. Вы можете вставить экземпляр класса вместо ? и implemented может быть результатом myMethod.Invoke(yourClassInstance, new object[] { "", "" }).

2
myMethod.Invoke(?, new object[] { "", "" }); 

? не имеет ничего с возвращаемым интерфейсом, но это фактический объект, метод которого вы вызываете. Если вы знаете, что этот метод возвращает класс, который реализует IDataReader просто написать

IDataReader rd=myMethod.Invoke(yourInstance, new object[] { "", "" });. 
0

Вы не можете вернуть экземпляр типа интерфейса .Но вы можете явно привести в тип интерфейса и может решить это.

((myMethod.Invoke . . .) as InterfaceType) 
0

Просто так, как вы думаете, вы бы:

class Gadget 
{ 
    public IList<int> FizzBuzz(int length , int startValue) 
    { 
    if (length < 0) throw new ArgumentOutOfRangeException("length") ; 
    int[] list = new int[length]; 
    for (int i = 0 ; i < list.Length ; ++i) 
    { 
     list[i] = startValue++ ; 
    } 
    return list ; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
    object  x    = new Gadget() ; 
    Type  t    = x.GetType() ; 
    MethodInfo mi   = t.GetMethod("FizzBuzz") ; 
    object  returnedValue = mi.Invoke(x , new object[]{ 10 , 101 }) ; 
    IList<int> returnedList = (IList<int>) returnedValue ; 
    string  msg   = returnedList.Select(n => n.ToString(CultureInfo.InvariantCulture)).Aggregate((s,v) => string.Format("{0}...{1}" , s , v)) ; 
    Console.WriteLine(msg) ; 
    return; 
    } 
}