从反射获取实际类型fieldInfo

问题描述:

我正在编写一个软件的GUI API的通用包装,它有能力处理它自己的“内置”类型的一些,但我不知道如何获得它需要什么。例如,我正在做这件事来处理字符串:从反射获取实际类型fieldInfo

(“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 

这是我对其中A和B是从常见的类型,我还可以测试derrived API的类型,但我需要的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更多复制&粘贴其他“APITypes”的代码块。如果我一般不这样做,我只会传入从API的基类型派生的任何类型,它会工作,但我不知道如何获取fieldInfo的实际类型。如果我打印它,它将打印派生类型的名称,但我似乎无法将它们取出。

我希望我能说出我的问题。这是高度情景化的,但似乎应该是可能的。如果我能得到FieldType()打印的类型,我会是黄金。否则,我有#地区充满了其他如果语句,这肯定不是我想要的通用!

+0

您可能想用[tag:c#]替换其中一个标记,以便语言清晰。无论如何,这可能会获得更多的观点。 –

+0

不完全确定你要做什么,但也许是C#['is'](http://msdn.microsoft.com/zh-cn/library/scekt9xw(v = VS.100).aspx)关键字可能是使用? – Cameron

您能否提供该字段的TypeFieldInfoMakeField函数?

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; 
} 
+0

我什么都不知道,只是我从一个序列化的对象开始。我遍历所有公共字段并为它们创建GUI控件。所以我需要检测这个类型来从我打包的这个API运行正确的GUI静态方法。我可以一个接一个地做,但我无法将实际类型作为一个变量传递给可能需要多个类型的方法之一,所以我必须添加大量的其他方法 - 如果块全部运行相同的方法。 虽然有趣的模式...这是除了OP,但可以不止一个受到限制? – Rafe

+1

如果你的意思是可以限制多个类型,答案是肯定的 - public static void FieldInfoMakeField (T instance,FieldInfo fieldInfo)where T:new()where V:new() –