C#反射与泛型GetValue转换

C#反射与泛型GetValue转换,c#,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=(

如果我们有不同的领域,比如

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(...);
}

除非希望将对象存储在特定于类型的变量中,否则没有理由知道对象的类型。变量的类型必须在编译时声明(是的,即使它是用
var
声明的,编译时编译器会扩展它)。因此,即使您可以编写一个泛型方法,将
GetValue
作为特定类型返回,这在您描述的场景中也不太有用,因为您仍然不知道要编写什么代码来声明要将其放入的变量

也就是说,编写通用方法非常简单:

static class ExtensionMethods
{
    public static T GetTypedValue<T>(this FieldInfo This, object instance)
    {
        return (T)This.GetValue(instance);
    }
}
静态类扩展方法
{
公共静态T GetTypedValue(此字段信息,此对象实例)
{
返回(T)This.GetValue(实例);
}
}
你会这样称呼它:

bool someFlag = fieldInfo.GetTypedValue<bool>(instance);
int someNum = fieldInfo.GetTypedValue<int>(instance); 
boolsomeflag=fieldInfo.GetTypedValue(实例);
int someNum=fieldInfo.GetTypedValue(实例);
或者(这会生成相同的IL代码):

var someFlag=fieldInfo.GetTypedValue(实例);
var someNum=fieldInfo.GetTypedValue(实例);

除非您希望将对象存储在特定于类型的变量中,否则没有理由知道对象的类型。变量的类型必须在编译时声明(是的,即使它是用
var
声明的,编译时编译器会扩展它)。因此,即使您可以编写一个泛型方法,将
GetValue
作为特定类型返回,这在您描述的场景中也不太有用,因为您仍然不知道要编写什么代码来声明要将其放入的变量

也就是说,编写通用方法非常简单:

static class ExtensionMethods
{
    public static T GetTypedValue<T>(this FieldInfo This, object instance)
    {
        return (T)This.GetValue(instance);
    }
}
静态类扩展方法
{
公共静态T GetTypedValue(此字段信息,此对象实例)
{
返回(T)This.GetValue(实例);
}
}
你会这样称呼它:

bool someFlag = fieldInfo.GetTypedValue<bool>(instance);
int someNum = fieldInfo.GetTypedValue<int>(instance); 
boolsomeflag=fieldInfo.GetTypedValue(实例);
int someNum=fieldInfo.GetTypedValue(实例);
或者(这会生成相同的IL代码):

var someFlag=fieldInfo.GetTypedValue(实例);
var someNum=fieldInfo.GetTypedValue(实例);

没有,但是看看
IConvertible
有人有什么好主意吗?详情请参阅。它是由John Wu@John WuNo提供的代码修改而来的,但是看看
IConvertible
有人有什么好主意吗?详情请参阅。它是根据John Wu@John Wu提供的代码修改的。非常感谢。我们希望将反映的值分配给UI中控件的特定于类型的属性。您给出的方法相当于一个明显的类型转换。我们可以通过
FieldInfo.FieldType
FieldInfo.FieldType.Name
读取字段类型。但是,它是一个类型类或字符串类。我们不知道如何通过此类型或字符串进行转换。我不确定您为什么需要强制转换或转换。只需将
object
的实例传递给
SetValue
。看。一个非常好的网站,谢谢!进行了一些更改,您的
SetValue
方法将无效,需要进行转换。请看[链接]非常感谢。我们希望将反映的值分配给UI中控件的特定于类型的属性。您给出的方法相当于一个明显的类型转换。我们可以通过
FieldInfo.FieldType
FieldInfo.FieldType.Name
读取字段类型。但是,它是一个类型类或字符串类。我们不知道如何通过此类型或字符串进行转换。我不确定您为什么需要强制转换或转换。只需将
object
的实例传递给
SetValue
。看。一个非常好的网站,谢谢!进行了一些更改,您的
SetValue
方法将无效,需要进行转换。请参阅[连结]