当前位置: 首页 > 编程语言 > C#

如何获取DataMemberAttribute指定名称的属性?分享

时间:2023-04-11 11:49:44 C#

如何获取指定名称的DataMemberAttribute属性?我如何反射性地获取具有给定名称的DataMember的属性(假设每个DataMember都有一个唯一的名称)?例如,在下面的代码中,名为“p1”的DataMember的属性是PropertyOne:[DataContract(Name="MyContract")]publicclassMyContract{[DataMember(Name="p1")]publicstringPropertyOne{get;放;}[DataMember(Name="p2")]publicstringPropertyTwo{get;放;}[DataMember(Name="p3")]publicstringPropertyThree{get;放;目前,我有:stringdataMemberName=。..;vardataMemberProperties=typeof(T).GetProperties().Where(p=>p.GetCustomAttributes(typeof(DataMemberAttribute),false).Any());varpropInfo=dataMemberProperties.Where(p=>((DataMemberAttribute)p.GetCustomAttributes(typeof(DataMemberAttribute),false).First()).Name==dataMemberName).FirstOrDefault();这有效,但感觉它可以改进。我特别不喜欢GetCustomAttributes()被调用两次。如何更好地重写它?理想情况下,如果我能把它变成一个简单的单行,那就太好了。//使用System.Linq;//使用系统反射;//使用System.Runtime.Serialization;obj.GetType().GetProperties(…).Where(p=>Attribute.IsDefined(p,typeof(DataMemberAttribute))).Single(p=>((DataMemberAttribute)Attribute.GetCustomAttribute(p,typeof(DataMemberAttribute))).Name=="Foo");注意:您可以使用LINQ:stringdataMemberName=...;varpropInfo=(frompropertyintypeof(T).GetProperties()letattributes=property.GetCustomAttributes(typeof(DataMemberAttribute),false).OfType()whereattributes.Any(a=>a.Name==dataMemberName)选择属性).FirstOrDefault();或者如果您愿意:stringdataMemberName=...;varpropInfo=typeof(T).GetProperties().Where(p=>p.GetCustomAttributes(typeof(DataMemberAttribute),false).OfType().Any(x=>x.Name==dataMemberName)).FirstOrDefault();您可以使用Fasterflect使您的反射代码更简单、更容易:varproperty=typeof(T).MembersAndAttributes(MemberTypes.Property,typeof(DataMemberAttribute))。什么时候re(ma=>ma.Attributes.First().Name==dataMemberName).Select(ma=>ma.MemberasPropertyInfo).FirstOrDefault();如果您只需要检查一个属性是否存在,您可以使用以下内容:Fasterflect带有一组很好的扩展方法,如果您还需要速度,可以使用IL生成一些简洁的性能优化我需要获取属性的值而不是属性本身所以使用DarinDimitrov的答案但添加.GetValue(this)到结束返回值。这就是我的课程最终的样子:以上是C#学习教程:如何获取具有指定名称的DataMemberAttribute属性?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——[DataContract]publicclassItem{[DataMember(Name="kpiId")]publicstringKPIId{get;放;}[DataMember(Name="value")]publicstringValue{get;放;}[DataMember(Name="unit")]publicstringUnit{get;放;}[DataMember(Name="status")]}[DataMember(Name="category")]publicstringCategory{get;放;}[DataMember(Name="description")]publicstringDescription{get;放;}[DataMember(Name="source")]publicstringSource{get;放;}[DataMember(Name="messages")]publicSysMessage[]Messages{get;放;}publicobjectgetDataMemberByName(stringname){return(typeof(Item).GetProperties().FirstOrDefault(p=>p.GetCustomAttributes(typeof(DataMemberAttribute),false).OfType().Any(x=>x.Name==名称))).GetValue(这个);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:

最新推荐
猜你喜欢