Получение фактического типа из отражения fieldInfo - PullRequest
0 голосов
/ 26 сентября 2011

Я пишу обобщенную обертку вокруг 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 получены из общего типа, который я также могу проверить, но мне нужен тип derrived:

...
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 блоков копирования и вставки кода для других типов APIT.Если бы я не делал это в общем, я просто передал бы любой тип, производный от базового типа API, и это сработало бы, но я не могу понять, как получить фактический тип fieldInfo.Если я напечатаю его, он напечатает названия производных типов, но я не могу их вывести.

Надеюсь, я достаточно хорошо изложил свою проблему.Это очень ситуативный, но, кажется, это должно быть возможно.Если бы я мог просто получить тип, который печатает FieldType (), я был бы золотым.В противном случае у меня #regions заполнены инструкциями else if, что, конечно, не так универсально, как хотелось бы!

1 Ответ

1 голос
/ 27 сентября 2011

Можете ли вы предоставить 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;
}
...