从反射字段获取实际类型
本文关键字:类型 获取 反射 字段 | 更新日期: 2023-09-27 18:09:42
我正在编写一个围绕软件GUI API的通用包装器,它有能力处理相当多的自己的"内置"类型,但我不知道如何得到它所需要的。例如,我这样做是为了处理字符串:
("MakeTextField"answers"MakeField"是伪代码,它们接受一个值,显示一个GUI元素,然后从GUI返回值用于存储)
public static void FieldInfoMakeField<T>(T instance, System.Reflection.FieldInfo fieldInfo)
{
string label = fieldInfo.Name;
if (fieldInfo.FieldType == typeof(string))
{
var val = (string)fieldInfo.GetValue(instance);
val = MakeTextField(label, val);
fieldInfo.SetValue(instance, val);
return;
}
//else if ... more types
这是我所拥有的API类型,其中A和B是从公共类型派生的,我也可以测试,但我需要派生类型:
...
else if (fieldInfo.FieldType == typeof(APITypeA))
{
var val = (APITypeA)fieldInfo.GetValue(instance);
val = MakeField<APITypeA>(label, val); // My version, casts internally
fieldInfo.SetValue(APITypeA, val);
return;
}
else if (fieldInfo.FieldType == typeof(APITypeB))
{
var val = (APITypeB)fieldInfo.GetValue(instance);
val = MakeField<APITypeB>(label, val); // My version, casts internally
fieldInfo.SetValue(APITypeB, val);
return;
}
...
这一切都工作,但我有大约10更多的复制"粘贴代码块为其他"apittypes"。如果我不是一般地这样做,我将传入从API的基类型派生的任何类型,它将工作,但我不知道如何获得fieldInfo的实际类型。如果我打印它,它将打印派生类型的名称,但我似乎无法将它们打印出来。
我希望我把我的问题说得足够清楚。这是高度情境化的,但似乎应该是可能的。如果我能得到FieldType()打印的类型,那就太好了。否则,我有充满else if语句的#区域,这当然不像我想的那样通用!您是否能够将字段的Type
提供给FieldInfoMakeField
函数?
public static void FieldInfoMakeField<T, V>(T instance, FieldInfo fieldInfo)
{
string label = fieldInfo.Name;
var val = (V)fieldInfo.GetValue(instance);
val = MakeField<V>(label, val);
fieldInfo.SetValue(instance, val);
return;
}