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

类成员的自定义属性共享

时间:2023-04-10 21:40:27 C#

类成员的自定义属性我正在使用自定义属性来定义类成员如何映射到属性以作为表单帖子(支付网关)发布。我的自定义属性工作正常并且能够通过“名称”获取属性,但想通过成员本身获取属性。例如:getFieldName("姓名");VSgetFieldName(obj.Name);计划是编写一个方法,将具有成员的类序列化为可发布的字符串。这是我此时的测试代码,其中ret是一个字符串,PropertyMapping是自定义属性:foreach(MemberInfoiin(typeof(CustomClass)).GetMember("Name")){foreach(objectatini.GetCustomAttributes(true)){PropertyMappingmap=atasPropertyMapping;if(map!=null){ret+=map.FieldName;}}}提前致谢!除非您使用C#3.0,否则您无法真正做到这一点,在这种情况下,您需要依赖LINQ(嗯,表达式树)。您所做的是为lambda表达式创建一个虚方法,并让编译器生成表达式树(编译器进行类型检查)。然后你挖那棵树来获得成员。像这样:staticFieldInfoGetField(Expression>accessor){varmember=accessor.BodyasMemberExpression;if(member!=null){returnmember.MemberasFieldInfo;}返回空值;//或抛出异常...}给出以下类:classMyClass{publicinta;你可以像这样获取元数据://getFieldInfoofmember'a'inclass'MyClass'varf=GetField((MyClassc)=>ca);通过引用该字段,您可以以正常方式挖掘任何属性。那就是反思。静态TAttributeGetAttribute(此MemberInfo成员)其中TAttribute:Attribute{returnmember.GetCustomAttributes(typeof(TATtribute),false).Cast().FirstOrDefault();现在您可以通过编译器对任何字段挖掘属性进行严格检查的内容。它也适用于重构,如果您重命名“a”,VisualStudio将捕获它。varattr=GetField((MyClassc)=>ca).GetAttribute();Console.WriteLine(attr.DisplayName);那里的代码中没有单个文字字符串。你可以只做一半:foreach(PropertyMappingattribinAttribute.GetCustomAttributes(i,typeof(PropertyMapping))){ret+=map.FieldName;//无论你想让它做什么...}顺便说一句,你应该养成以attribute一词结束属性的习惯。即使这样也会导致重复(请参阅[XmlAttributeAttribute])。但是-重新序列化;这并不总是微不足道的。Json.NET等序列化框架中的欺骗性代码。通常的做法可能是获取类型转换器,但在很多方面使用PropertyDescriptor更容易:以上就是我在C#学习教程:类成员的自定义属性中分享的所有内容,如果它对您有用,您还需要了解更多关于C#学习教程,希望大家多多关注—foreach(PropertyDescriptorpropinTypeDescriptor.GetProperties(obj)){Console.WriteLine("{0}={1}",prop.Name,prop.Converter.ConvertToInvariantString(prop.GetValue(obj)));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: