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



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

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;
}

或类似的东西。

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

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

最新更新