У меня есть следующий пример-класс:
public class MyClass<T>
{
public IList<T> GetAll()
{
return null; // of course, something more meaningfull happens here...
}
}
И я хотел бы вызвать GetAll
с отражением:
Type myClassType = typeof(MyClass<>);
Type[] typeArgs = { typeof(object) };
Type constructed = myClassType.MakeGenericType(typeArgs);
var myClassInstance = Activator.CreateInstance(constructed);
MethodInfo getAllMethod = myClassType.GetMethod("GetAll", new Type[] {});
object magicValue = getAllMethod.Invoke(myClassInstance, null);
В результате (в последней строке кода выше):
Операции с поздним связыванием не могут быть выполнены для типов или методов, для которых ContainsGenericParameters имеет значение true.
Хорошо, вторая попытка:
MethodInfo getAllMethod = myClassType.GetMethod("GetAll", new Type[] {});
getAllMethod = getAllMethod.MakeGenericMethod(typeof(object));
object magicValue = getAllMethod.Invoke(myClassInstance, null);
В результате (во второй последней строке кода выше):
System.Collections.Generic.IList`1 [T] GetAll () не является GenericMethodDefinition. MakeGenericMethod может быть вызван только для метода, для которого MethodBase.IsGenericMethodDefinition имеет значение true.
Что я здесь не так делаю?