C#反射和泛型GetValue转换

时间:2018-03-21 02:49:01

标签: c#

如果我们有不同的字段,例如

int a;
bool b;
float c;

然后当我们使用反射

获取其值时,必须使用以下转换
a=(int)FieldInfo.GetValue(...);
b=(bool)FieldInfo.GetValue(...);
c=(float)FieldInfo.GetValue(...);

是否有一个通用的方法来获取值,以便可以使用foreach迭代?

foreach(FieldInfo info in type.GetFields())
{
   var v=(T)info.GetValue(...);
}

1 个答案:

答案 0 :(得分:2)

除非您希望将对象存储在特定于类型的变量中,否则没有理由知道对象的类型。变量的类型必须在编译时声明(是的,即使它是用var声明的,在构建时由编译器扩展)。因此,即使您可以编写一个通用方法来将GetValue作为特定类型返回,但这在您描述的场景中并不完全有用,因为您仍然不知道要编写哪些代码来声明变量&& #39;重新投入。

话虽这么说,一般的方法写得非常简单:

static class ExtensionMethods
{
    public static T GetTypedValue<T>(this FieldInfo This, object instance)
    {
        return (T)This.GetValue(instance);
    }
}

你可以这样称呼它:

bool someFlag = fieldInfo.GetTypedValue<bool>(instance);
int someNum = fieldInfo.GetTypedValue<int>(instance); 

或(这会产生相同的IL代码):

var someFlag = fieldInfo.GetTypedValue<bool>(instance);
var someNum = fieldInfo.GetTypedValue<int>(instance);