Установить статическое поле в общем классе по типу динамически - PullRequest
0 голосов
/ 16 мая 2018

У меня есть общий класс и статическое поле.

public class SomeGenericClass<T> : ISomeInterface<T> where T : SomeClass
{
    public static ISomeInterface<T> _someField;
}

И когда я хочу изменить значение этого поля, я должен изменить его для каждого типа, как это

var value = ...;
SomeGenericClass<Type1>._someField = value;
SomeGenericClass<Type2>._someField = value;
// ...
SomeGenericClass<Type3>._someField = value;

Можно ли сделать это в цикле, если у меня есть массив типов? Я хотел бы видеть что-то вроде этого

Type[] types = ... //Array of types
foreach(type in types){
    SomeGenericClass<type>._someField = value;
}

Или что-то в этом роде.

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете сделать это с помощью отражения. Сначала получите фактический тип:

var type = typeof(SomeGenericClass<>).MakeGenericType(theTypeArgument);

Теперь вы можете вызвать GetField для этого типа, чтобы получить поле:

var field = type.GetField("_someField");

Далее установите значение. Обратите внимание, что первый параметр, переданный SetValue, равен null, потому что поле static:

field.SetValue(null, value);

Наконец, заверните это в цикл, например ::1014*

foreach(var t in types)
{
    var type = typeof(SomeGenericClass<>).MakeGenericType(t);
    var field = type.GetField("_someField");
    field.SetValue(null, value);
}

Конечно, вы также должны добавить некоторые проверки, чтобы избежать NullReferenceException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...