从反射fieldInfo获取实际类型

时间:2011-09-26 01:38:21

标签: c# generics reflection casting fieldtype

我正在编写一个软件GUI API的通用包装器,它能够处理很多自己的“内置”类型,但我无法弄清楚如何获得它所需要的东西。例如,我这样做是为了处理字符串:

(“MakeTextField”和“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个复制和粘贴代码块用于其他“APITypes”。如果我没有这样做,我只会传入从API的基类型派生的任何类型,它会工作,但我无法弄清楚如何获得fieldInfo的实际类型。如果我打印它,它将打印派生类型的名称,但我似乎无法将它们取出。

我希望我能够很好地陈述我的问题。这是高度情境化的,但似乎应该是可能的。如果我能得到FieldType()打印的类型,我就是黄金。否则,我的#regions充满了其他if语句,这肯定不像我想的那样通用!

1 个答案:

答案 0 :(得分:1)

您是否可以向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;
}