我具有以下结构:
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 { }
}
我还有一个方法可以递归地给出从同一程序集中的基本类型继承的非抽象泛型和非泛型类型的列表,
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
构建方法是什么呢?
编辑:
我看着System.Reflection.Emit.TypeBuilder
通过反射构建TYPEPARAMETER
。我如何获得所收集子类A.B.IFooB,...
的所有通用类型参数接口allSubClasses
以便按所述方式构建TYPEPARAMETER
?