我正在编写一个软件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语句,这肯定不像我想的那样通用!
答案 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;
}