0

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

2 回答 2

2
A a = new A() { Age = 33 };
var age = a.GetType().GetProperty("Age").GetValue(a);
于 2012-12-14T20:45:54.447 回答
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(请参阅:如何仅找到同时具有 getter 和 setter 的属性?),或者它可能是一个自动属性(请参阅:如何找出一个属性是带有反射的自动实现属性吗?)但我猜这不一定是您的要求,可能只是正确使用该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?
        }
    }
}
于 2012-12-14T21:01:59.217 回答