Тип сборки, который реализует универсальные интерфейсы параметров типа c через Reflection - PullRequest
1 голос
/ 16 апреля 2020

У меня есть следующая структура:

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, как описано?

...