Как получить значение статического поля в универсальном классе (singleton), не зная универсального типа - PullRequest
0 голосов
/ 21 ноября 2018

Хорошо, я пытаюсь объяснить мой вопрос немного лучше: у меня есть

class DynamicTypeCreator{...}

и метод в нем:

static BuildASingletonClassWithTypeBuiler<T> (T object) {...}

Этот метод не только создает одноэлементный тип

class Singleton01<K> {...}

, но и создает его экземпляр, определяя поле

static Singleton01<K> instance = new Singleton01<K> (K object)

и другое поле

static Type typeOfGenericParameter = typeof(K).

(Фактический код https://github.com/TThaan/ExtensionPropertiesForCSharp отличается, но это не должно вызывать беспокойства.)
Однако этот метод не возвращает тип синглтона или экземпляр.Он просто создает их.
Действительно, много раз, только меняя имя типа с Singleton01 на Singleton02, Singleton03 и т. Д. И каждый раз с другим T object в качестве параметра.
Так что, когда я хочу получить доступ к одномуиз этих синглетонов позже я не знаю, какой объект он содержит и какого типа.Чтобы получить значение любого статического поля, например, в «Singleton03», я сначала использую

Type type = AssemblyBuilder.GetType("Singleton03").

Попытка получить значение статического поля теперь не работает, она просто нулевая.Кажется, я вынужден использовать

Type genericType = type.MakeGenericType(new[] { typeof(T) }).

Но чтобы это работало, мне уже нужно знать тип моего параметра T object.
Я хочу знать, есть ли способ получить значение статического поля в таком универсальном типеперед использованием .MakeGeneric().

1 Ответ

0 голосов
/ 24 ноября 2018

Я нашел ответ.
Поскольку универсальный класс одного типа на самом деле является другим классом, чем "тот же класс" другого типа,
статическое поле в одном из этих классов отличается от поля вдругой класс.Поэтому я не могу получить значение одного из этих полей перед использованием .MakeGeneric() с типом подгонки.
Решение состоит в том, чтобы изменить создание моего класса, например, как здесь: Универсальные классы и статические поля .

...