标签:
问题:实例化的对象,反射后得到的列表包含了被隐藏的基类成员,这时如果转换为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
标签:
原文地址:http://www.cnblogs.com/smallidea/p/5259365.html