如果定义为自动属性,我如何获得字段值?

时间:2012-12-14 20:41:52

标签: c# reflection automatic-properties

如果将字段定义为自动属性,如何获取字段值? 我不知道为什么,但是第一次遇到这样一个简单的任务时,这个名为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)
                }
             }
}

2 个答案:

答案 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?
        }
    }
}