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

C# 按类型动态设置泛型类中的静态字段,c#,generics,generic-programming,C#,Generics,Generic Programming,我有一个泛型类和静态字段 public class SomeGenericClass<T> : ISomeInterface<T> where T : SomeClass { public static ISomeInterface<T> _someField; } 公共类SomeGenericClass:ISomeInterface其中T:SomeClass { 公共静态接口_someField; } 当我想改变这个字段的值时,我必须改变每种类型

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

public class SomeGenericClass<T> : ISomeInterface<T> where T : SomeClass
{
    public static ISomeInterface<T> _someField;
}
公共类SomeGenericClass:ISomeInterface其中T:SomeClass
{
公共静态接口_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值=。。。;
SomeGenericClass.\u someField=值;
SomeGenericClass.\u someField=值;
// ...
SomeGenericClass.\u 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;
}
Type[]类型=//类型数组
foreach(键入类型){
SomeGenericClass.\u someField=值;
}

或者类似的东西。

你可以通过反射来实现。首先获取实际类型:

var type = typeof(SomeGenericClass<>).MakeGenericType(theTypeArgument);
接下来设置值。请注意,传递给
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);
}
foreach(类型中的变量t)
{
var type=typeof(SomeGenericClass)。MakeGenericType(t);
var field=type.GetField(“\u someField”);
field.SetValue(null,value);
}

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

您认为
value
适合所有类型吗?您如何知道“所有”类型?您想在编译时这样做吗?在这种情况下,您可以使用T4文本模板,或者在运行时,您可以使用运行时类型信息。我有一个泛型类,其中T:Entity。我想为我理解的实体classI的每个子级更改这个静态字段。但在我的例子中,类型不包含“\u someField”,它位于SomeGenericClass
var field=type.GetField(“\u someField”);field=null
类型
已经引用了
某个通用类
。你调试过这个并得到了
field==null
?是的,当我制作
field.SetValue(null,value)时
得到一个异常,字段为nullUsed GetProperty而不是GetField,它工作了,但现在我有一个异常
System.ArgumentException:无法将类型为“System.RuntimeType”的对象强制转换为类型为“WpfApp.DataProvider.Repository.IDocumEnterpository
1[WpfApp.Domain.Storage]”。of System.RuntimeType.TryChangeType(对象值、绑定器、文化信息文化、布尔需要特殊广播)of System.RuntimeType.CheckValue(对象值、绑定器绑定器、文化信息文化、绑定标志invokeAttr)`