动态地按类型设置泛型类中的静态字段

时间:2018-05-16 08:28:42

标签: c# generics generic-programming

我有一个泛型类和静态字段。

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 :(得分:1)

你可以通过反思来做到这一点。首先得到实际类型:

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

现在,您可以在该类型上调用GetField以获取字段:

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

接下来设置值。请注意,传递给SetValue的第一个参数是null,因为该字段为static

field.SetValue(null, value);

最后将其包装成循环,例如:

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

当然,您还应添加一些检查以避免NullReferenceException