c# – 如何通过反射获取单个调用中的字段和属性? - 代码日志

c# – 如何通过反射获取单个调用中的字段和属性?

如果这被覆盖在某个地方,我很抱歉。我在发布之前做了研究!

好的,所以问题…我使用GetType().GetProperties,但它没有返回简单的实例字段,没有获取/设置他们…所以我使用.GetFields,找到它们,但是我想获得一个简单的单个对象来获取/设置一个值,而不会在字段和属性之间翻转…这是可能的吗?

我目前的代码在PropertyInfo上工作,这是非常有用的,但是这不是我猜的字段吗?

[编辑]
这是我想出的解决方案,这是很好的。感谢大家….

    // some logic borrowed from James Newton-King, http://www.newtonsoft.com
    public static void SetValue(this MemberInfo member, object property, object value)
    {
        if (member.MemberType == MemberTypes.Property)
            ((PropertyInfo)member).SetValue(property, value, null);
        else if (member.MemberType == MemberTypes.Field)
            ((FieldInfo)member).SetValue(property, value);
        else
            throw new Exception("Property must be of type FieldInfo or PropertyInfo");
    }

    public static object GetValue(this MemberInfo member, object property)
    {
        if (member.MemberType == MemberTypes.Property)
            return ((PropertyInfo)member).GetValue(property, null);
        else if (member.MemberType == MemberTypes.Field)
            return ((FieldInfo)member).GetValue(property);
        else
            throw new Exception("Property must be of type FieldInfo or PropertyInfo");
    }

    public static Type GetType(this MemberInfo member)
    {
        switch (member.MemberType)
        {
            case MemberTypes.Field:
                return ((FieldInfo)member).FieldType;
            case MemberTypes.Property:
                return ((PropertyInfo)member).PropertyType;
            case MemberTypes.Event:
                return ((EventInfo)member).EventHandlerType;
            default:
                throw new ArgumentException("MemberInfo must be if type FieldInfo, PropertyInfo or EventInfo", "member");
        }
    }
怎么样:

const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;
MemberInfo[] members = type.GetFields(bindingFlags).Cast<MemberInfo>()
    .Concat(type.GetProperties(bindingFlags)).ToArray();

或者,像FastMember这样的库可以快速地与任何字段或属性一起工作,而get / set与成员类型无关。

http://stackoverflow.com/questions/12680341/how-to-get-both-fields-and-properties-in-single-call-via-reflection

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 如何通过反射获取单个调用中的字段和属性?