У меня есть следующая структура:
namespace A
{
abstract public class BaseClass<To, T> { }
}
namespace A.B
{
interface IFooB { double Prop1 { get; set; } }
abstract public class BaseSubClassB<T> : A.BaseClass<float, T> { }
public class SubClassB<T> : BaseSubClassB<T> where T : IFooB { }
}
namespace A.C
{
interface IFooC { double Prop2 { get; set; } }
abstract public class BaseSubClassC<T> : A.BaseClass<bool, T> { }
pubic class SubClassC<T> : BaseSubClassC<T> where T : IFooC { }
}
У меня также есть метод, который рекурсивно дает список типов non-abstract generi c и non-generi c, которые наследуются от базового типа. в той же сборке, как и
public static List<Type> GetAllDerivedTypes(Type baseType) { ... };
, так что GetAllDerivedTypes(typeof(A.BaseClass<, >))
в основном возвращает
List<Type> allSubClasses = new List<Type> {typeof(A.B.SubclassB<>), typeof(A.C.SubClassC<>)}
Теперь я хотел бы создать экземпляр каждого из этих собранных типов в allSubClasses
. Цель здесь состоит в том, чтобы проверить в модульных тестах, не вызывает ли некоторые методы, определенные в базовом классе для каждого экземпляра, исключения. Насколько я понимаю, мне нужно будет сделать что-то вроде следующего:
foreach(var type in allSubClasses)
{
Type constructedType = type.MakeGenericType(new Type[] { typeof(TYPEPARAMETER) });
var obj = Activator.CreateInstance(constructedType);
Assert.That(obj.operation()); <- OK
}
, где TYPEPARAMETER
может быть классом, который предоставляет все свойства, необходимые в параметрах типа подклассов в allSubClasses
, например,
public class TYPEPARAMETER : A.B.IFooB, A.C.IFooC, ...
{
double Prop1 { get; set; }
double Prop2 { get; set; }
...
}
Это был бы правильный подход для создания экземпляров? И если да, каков будет способ построения TYPEPARAMETER
во время выполнения через Reflection, которая реализует все необходимые интерфейсы и их свойства?
РЕДАКТИРОВАТЬ:
Я посмотрел на System.Reflection.Emit.TypeBuilder
, чтобы построить TYPEPARAMETER
через Reflection. Как получить все обобщенные c интерфейсы параметров типа A.B.IFooB, A.C.IFooC, ...
собранных подклассов allSubClasses
, чтобы построить TYPEPARAMETER
, как описано?