如何获得通过反射一次调用这两个字段和属性? [英] how to get both fields and properties in single call via reflection?

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

问题描述

我道歉,如果这是什么地方覆盖。我做研究,然后再发布!

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

我目前的code工作在的PropertyInfo,这是伟大的工作,但是这不是场我猜?


这是我来到了,这是工作好了解决方案。感谢大家....

  //一些逻辑詹姆斯牛顿 - 借景,http://www.newtonsoft.com
    公共静态无效的SetValue(这的MemberInfo成员,对象属性,对象的值)
    {
        如果(member.MemberType == MemberTypes.Property)
            ((的PropertyInfo)成员).SetValue(属性值,NULL);
        否则,如果(member.MemberType == MemberTypes.Field)
            ((字段信息)成员).SetValue(属性值);
        其他
            抛出新的异常(财产的类型必须为字段信息或的PropertyInfo的);
    }    公共静态对象的GetValue(这的MemberInfo成员,对象属性)
    {
        如果(member.MemberType == MemberTypes.Property)
            返回((的PropertyInfo)成员).GetValue(财产,NULL);
        否则,如果(member.MemberType == MemberTypes.Field)
            返回((字段信息)成员).GetValue(财产);
        其他
            抛出新的异常(财产的类型必须为字段信息或的PropertyInfo的);
    }    公共静态类型的GetType(此的MemberInfo成员)
    {
        开关(member.MemberType)
        {
            案例MemberTypes.Field:
                回报((字段信息)成员).FieldType;
            案例MemberTypes.Property:
                回报((的PropertyInfo)成员).PropertyType;
            案例MemberTypes.Event:
                回报((EventInfo)成员).EventHandlerType;
            默认:
                抛出新的ArgumentException(的MemberInfo必须是如果类型字段信息,或者的PropertyInfo EventInfo,会员);
        }
    }


解决方案

如何

 常量的BindingFlags的BindingFlags = BindingFlags.Public | BindingFlags.Instance;
的MemberInfo [] =成员type.GetFields(的BindingFlags).Cast<&的MemberInfo GT;()
    。.Concat(type.GetProperties(的BindingFlags))ToArray的();

另外,如 FastMember 库会很乐意与字段或属性的作用,具有get /成员类型的设置相同,无论

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

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?

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

[edit] this is the solution I came up with, which is working good. thanks everyone....

    // 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");
        }
    }

解决方案

How about:

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

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

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

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