如果我们有不同的字段,例如
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(...);
}
答案 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);