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

如何在C#中从对象实例中获取自定义属性分享

时间:2023-04-10 17:42:32 C#

如何在C#中从对象实例中获取自定义属性假设我有一个名为Test的类,其属性名为Title,具有自定义属性:publicclassTest{[DatabaseField("title")]publicstringTitle{get;放;还有一个名为DbField的扩展方法。我想知道是否可以从C#中的对象实例获取自定义属性。测试t=新测试();字符串字段名=t.Title.DbField();//fieldName将等于“title”,传递给上面属性的相同名称是否可以这样做?这是一种方法。扩展方法有效,但并不那么容易。我创建一个表达式,然后检索自定义属性。使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Linq.Expressions;namespaceConsoleApplication1{publicclassDatabaseFieldAttribute:Attribute{publicstringName{get;放;}publicDatabaseFieldAttribute(stringname){this.Name=name;}}publicstaticclassMyClassExtensions{publicstaticstringDbField(thisTobj,Expression>value){varmemberExpression=value.BodyasMemberExpression;varattr=memberExpression.Member.GetCustomAttributes(typeof(DatabaseFieldAttribute),true);返回((DatabaseFieldAttribute)attr[0]).Name;}}classProgram{staticvoidMain(string[]args){varp=newProgram();Console.WriteLine("DbField='{0}'",p.DbField(v=>v.Title));}[DatabaseField("title")]publicstringTitle{get;放;}}}namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){Testt=newTest();Console.WriteLine(t.FieldName("标题").FieldName());Console.WriteLine(t.FieldName("标题").FieldIsPrimaryKey());}}publicclassTest{[DatabaseField("titlezzz",true)]publicstringTitle{get;放;}}publicclassBaseDatabaseFieldAttribute:Attribute{privatereadonlystring_name;publicstringName{get{return_name;}}publicBaseDatabaseFieldAttribute(字符串名称){_name=名称;}}publicclassDatabaseFieldAttribute:BaseDatabaseFieldAttribute{privatereadonlybool_isPrimaryKey;公共布尔IsPrimaryKey{得到{返回_isPrimaryKey;}}publicDatabaseFieldAttribute(stringname,boolisPrimaryKey):base(name){_isPrimaryKey=isPrimaryKey;}}publicstaticclassHelper{publicstaticPropertyInfoFieldName(thisobjectobj,stringpropertyName){returnobj.GetType().GetProperty(propertyName);}publicstaticstringFieldName(这个PropertyInfo属性)whereT:BaseDatabaseFieldAttribute{object[]os=property.GetCustomAttributes(typeof(T),false);如果(os!=null&&os.Length>=1)return(os[0]asT).Name;否则返回“N/A”;公共静态布尔?FieldIsPrimaryKey(此PropertyInfo属性)其中T:DatabaseFieldAttribute{object[]os=property.GetCustomAttributes(typeof(T),false);if(os!=null&&os.Length>=1)return(os[0]asT).IsPrimaryKey;否则返回空;是的,但最终这将是一种迂回的方式,因为您将在您的实例上调用GetType以获取Type实例,然后对其执行某些操作(通常)在这种特定情况下,您的扩展方法无法获取属性信息,因为您传递给它的所有内容都是一个字符串。最终,您需要的是获取PropertyInfo。其他答案涉及类型,他们缺少的是它不是获取所需PropertyInfo的属性信息的唯一方法。您可以通过传递带有字符串(可能是属性名称)的Type实例来执行此操作,因此您可以调用Type上的GetProperty。自C#3.0以来,另一种实现此目的的方法是获取一个表达式,然后使用该表达式的部分来获取PropertyInfo。在这种情况下,您将把Expression>或TResult作为字符串的内容。获取PropertyInfo,您可以在其上调用GetCustomAttributes,并查找属性。表达式方法的优点是Expression派生自LambdaExpression,您可以调用Compileon然后调用以获取实际值(如果需要)。正如已经指出的那样,原始海报所描述的语法是不可能的,因为您无法在扩展方法中获得对PropertyInfo的引用。像这样怎么样://扩展方法publicstaticstringGetDbField(thisobjectobj,stringpropertyName){PropertyInfoprop=obj.GetType().GetProperty(propertyName);object[]dbFieldAtts=prop.GetCustomAttributes(typeof(DatabaseFieldAttribute),true);如果(dbFieldAtts!=null&&dbFieldAtts.Length>0){return((DatabaseFieldAttribute)dbFieldAtts[0]).Name;}返回“未定义”;然后你可以得到这样的信息:Testt=newTest();stringdbField=t.GetDbField("标题");不,这是不可能的。这样做的原因是它是值,而不是属性本身,将被发送到可以获取此信息的任何自定义扩展方法。一旦进入该扩展方法,就没有可靠的方法可以追溯到属性本身。枚举值可能是可行的,但就POCO的属性而言,它不会起作用。要获取属性值,您需要该属性适用的类型。你的扩展方法只获取字符串值(Title的值),所以你将无法获取字符串来自的实际实例,因此你将无法获取Title属性所属的原始类型.这将阻止您从扩展方法中获取属性值。以上就是C#学习教程:C#中如何从对象实例获取自定义属性共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: