从反射字段获取实际类型

本文关键字:类型 获取 反射 字段 | 更新日期: 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;
}