2014-09-11 5 views
0

У меня есть сборка, которая содержит класс. Этот класс имеет два методаC# отражение и методы двусмысленности

public IEnumerable Invoke(); 
public IEnumerable<T> Invoke<T>(); 

я динамически загрузить сборку

Assembly as = Assembly.Load("MyAssemblyName, Version= 6.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35") 
Type type = as.GetType("MyClass"); 
object myObject= Activator.CreateInstance(type); 

IEnumerable test= (IEnumerable)myObject.GetType().InvokeMember("Invoke", BindingFlags.InvokeMethod, null, myObject, null); 

Я хочу этот метод называется: общественный IEnumerable Invoke();

, когда я запускаю программу, я получил сообщение об ошибке: Неоднозначный матч нашел

Так что нужно сделать, чтобы удалить двусмысленность, так что не-шаблонный метод будет называться?

Заранее спасибо.

+0

@Luaan, который попытается вызвать элемент IEnumerable, называемый «Invoke», который не существует. – phoog

+0

Да, я пропустил этот момент. Почему бы не создать интерфейс, который имеет эти методы 'Invoke', а затем вызвать это без необходимости использовать отражение в первую очередь? – Luaan

+0

@ Luaan Очевидно, это код игрушки, чтобы продемонстрировать проблему. – Casey

ответ

7

Вы можете найти способ, позвонив по телефону GetMethods и проверить, что ContainsGenericParameters является ложным. При желании вы также можете проверить значение параметра на ноль.

var method = yourType.GetMethods() 
    .Where(x => x.Name == "Invoke") 
    .First(x => !x.ContainsGenericParameters); 
method.Invoke(myObject, null);