如果将字段定义为自动属性,如何获取字段值?
我不知道为什么,但是第一次遇到这样一个简单的任务时,这个名为GetValue
的无法解释的方法不能正常工作,通常会抛出各种异常,而不是做原来的简单工作。
一些代码例如:
Class A
{
public int Age { get; set;}
}
现在假设在反射之后我在FiledInfo []的结构中保存A实例的字段
现在我在上面的数组中找到了相关的fieldInfo,他的名字是:
无论如何,{Int32 k__BackingField}听起来很奇怪。
如何使用GetValue()来获取int值?正如我所说,我尝试了很多东西......
编辑:(这是部分简化代码 - 不要生气)
private static string foo1<T>(T o)
{
var type = o.GetType();
var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
....
foo(fields);
}
}
private static void foo(FieldInfo[] fields)
{
foreach (FieldInfo field in fields)
{
if (field.FieldType.IsValueType)
{
var fieldNameLength = field.Name.IndexOf(">") - (field.Name.IndexOf("<")+1);
var fieldName = field.Name.Substring(field.Name.IndexOf("<")+1, fieldNameLength);
var fieldValue = field.ReflectedType.GetProperty(fieldName).GetValue(field.ReflectedType, null)
}
}
}
答案 0 :(得分:2)
A a = new A() { Age = 33 };
var age = a.GetType().GetProperty("Age").GetValue(a);
答案 1 :(得分:1)
而不是var fieldValue = field.ReflectedType.GetProperty(fieldName).GetValue(field.ReflectedType, null)
你应该只有var fieldValue = field.GetValue(o, null)
注意你需要传递o
的实例。真的,你应该做LB发布的内容并按名称查找你的财产,或者,如果您不知道名称,请通过myType.GetProperties
以下是修改后的代码以使用属性:
private static void foo1<T>(T o)
{
var type = o.GetType();
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
foo(properties, o);
}
private static void foo(PropertyInfo[] properties, object o)
{
foreach (PropertyInfo property in properties)
{
if (property.PropertyType.IsValueType)
{
var propertyValue = property.GetValue(o, null);
//do something with the property value?
}
}
}
编辑:你可能想确保该属性有一个getter(参见:How do you find only properties that have both a getter and setter?),或者它可能是一个自动属性(参见:How to find out if a property is an auto-implemented property with reflection?)但是我猜这是不一定是你的要求,可能只是正确使用GetValue
方法或如何使用反射来检查类型。
编辑:如果您仍想使用它们,请使用相同的代码:
private static void foo1<T>(T o)
{
var type = o.GetType();
var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
foo(fields, o);
}
private static void foo(FieldInfo[] fields, object o)
{
foreach (FieldInfo field in fields)
{
if (field.FieldType.IsValueType)
{
var fieldValue = field.GetValue(o);
//do something with the field value?
}
}
}