zoukankan      html  css  js  c++  java
  • 反射的结果中排除隐藏的成员

    问题:实例化的对象,反射后得到的列表包含了被隐藏的基类成员,这时如果转换为hashtable将会报key以存在的错误,如果单独使用GetProperty(“”),将会引发异常“System.Reflection.AmbiguousMatchException”

    分析:找不到办法得到不包含基类成员集合,因为他们声明在不同的类中。

    解决方法:DeclaringType得到“获取声明该成员的类”, ReflectedType得到“获取用于获取 MemberInfo 的此实例的类对象”,通过对这两个的判断找到被隐藏的基类成员,并从集合中排除。

    源码:

    using Fasterflect;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                class3 cls = new class3();
                cls.id = "guid";
                cls.value = "1.25F";
    
                var propertyArray = cls.GetType().GetProperties().ToList();
    
                foreach (var item in propertyArray)
                {
                    Console.WriteLine(item.PropertyType.ToString() + ":" + item.Name);
                }
    
                // 排除基类被隐藏的成员
                var tmpList = from a in propertyArray
                              group a by a.Name into g
                              select g;
                foreach (var item in tmpList)
                {
                    if (item.Count() > 1)
                    {
                        var itemSubList = item.Where(a => a.DeclaringType != a.ReflectedType);
                        foreach (var sub in itemSubList)
                        {
                            propertyArray.Remove(sub);
                        }
                    }
                }
    
                Console.WriteLine();
                Console.WriteLine("——————————————");
                Console.WriteLine("排除基类中的被隐藏的成员:");
                foreach (var item in propertyArray) {
                    Console.WriteLine(item.PropertyType.ToString() + ":" + item.Name);
                }
    
    
                Console.Read();
            }
        }
    
    
        class class1
        {
            private string pri { get; set; }
            public object value { get; set; }
            public virtual string id { get; set; }
        }
    
        class class2 : class1
        {
            new public float value { get; set; }
    
            public string test { get; set; }
    
            public override string id { get; set; }
        }
    
        class class3 : class2
        {
            new public string value { get; set; }
        }
    }
    

    参考:

    https://msdn.microsoft.com/zh-cn/library/435f1dw2.aspx

    http://blogs.msdn.com/b/weitao/archive/2007/04/26/binding-to-hidden-properties-using-reflection.aspx

  • 相关阅读:
    题目:心灵的抚慰
    间谍网络
    tarjan算法模版
    rect
    学校食堂
    题目:自然的雪糕
    Winform里众多上下文菜单的控制要怎么做?
    ubuntu更新列表
    瞧,Silverlight是如何被部署到客户机的
    盖茨十条成功箴言 值得一生铭记
  • 原文地址:https://www.cnblogs.com/smallidea/p/5259365.html
Copyright © 2011-2022 走看看