Я пишу обобщенную обертку вокруг 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, что, конечно, не так универсально, как хотелось бы!