如何通过反射在单个调用中同时获取字段和属性? [英] how to get both fields and properties in single call via reflection?

查看:13
本文介绍了如何通过反射在单个调用中同时获取字段和属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果这在某处被覆盖,我深表歉意.发帖前我做了研究!

I apologize if this is covered somewhere. I did research before posting!

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

okay, so question...I'm using GetType( ).GetProperties, but it isn't returning simple instance fields, which don't have get/set on them...so I used .GetFields, which finds them, but I want to get a simple single object to get/set a value on without flipping between fields and properties...is this possible?

我当前的代码适用于 PropertyInfo,效果很好,但我猜这不适用于字段?

my current code works on PropertyInfo, which is working great, but that isn't for fields I guess?

这是我想出的解决方案,效果很好.谢谢大家....

    // 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 都是相同的.

Alternatively, libraries like FastMember will work happily with either fields or properties, with get/set identical regardless of the member-type.

这篇关于如何通过反射在单个调用中同时获取字段和属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆