У вас очень интересная ситуация, и вы не можете найти что-то конкретное на паутине, окружающее отражение, наследование и дженерики.
Для начала:
У меня есть базовый абстрактный класс, называемый:
public abstract class ItemBase
{
// default properties
}
ItemBase становится моим суперклассом для абстрактной сущности с именем Item:
public abstract class Item
{
// some extra properties
}
Идея, стоящая за этим, заключается в создании сущностей, которые будут наследоваться от Item с установленными дополнительными свойствами:
public partial class City : Item {}
Теперь в тестовом методе я пытаюсь использовать рефлексию для вызова метода переданной сущности и возврата любых данных в любой форме обратно из метода.
Предполагается, что для целей тестирования у нас есть метод в State, который возвращает коллекцию всех крупных городов:
public List<City> GetAllMajorCities() {}
В моих заглушках у меня может быть тест, чтобы получить все города:
List<Item> cities = this.InvokeGenericMethod<Item>("State", "GetAllMajorCities", args);
Тогда InvokeGenericMethod (строка, строка, объект [] args) выглядит примерно так:
public IEnumerable<T> InvokeGenericMethod<Item>(string className, string methodName, object[] args)
{
Type classType = className.GetType(); // to get the class to create an instance of
object classObj = Activator.CreateInstance(classType);
object ret = classType.InvokeMember(methodName, BindingFlags.InvokeMethod, null, classObj, args);
}
Теоретически, из приведенного примера значение «ret» должно быть типом IEnumerable, однако возвращаемый тип, если он добавлен к часам для исследования, возвращает List, если я проверяю значение ret как:
if (ret is IEnumerable<T>)
игнорирует чек.
Если я изменюсь
public List<City> GetAllMajorCities() {}
до
public List<ItemBase> GetAllMajorCities() {}
Кажется, он придерживается наследства и позволяет мне привести его к IEnumberable.
Я здесь совершенно тупой.
Любые идеи, рекомендации будут с благодарностью.
Спасибо
Эрик