Csharp/C#教程:反思 – 获取属性名称分享


反思 – 获取属性名称

我想在不使用魔术字符串的情况下将属性名称传递给函数。

就像是:

Get(x=>x.Property1); 

其中Property1是ObjectType类型的属性。

方法实现会是什么样的?

这可以使用表达式来实现:

 // requires object instance, but you can skip specifying T static string GetPropertyName(Expression> exp) { return (((MemberExpression)(exp.Body)).Member).Name; } // requires explicit specification of both object type and property type static string GetPropertyName(Expression> exp) { // extract property name return (((MemberExpression)(exp.Body)).Member).Name; } // requires explicit specification of object type static string GetPropertyName(Expression> exp) { var body = exp.Body; var convertExpression = body as UnaryExpression; if(convertExpression != null) { if(convertExpression.NodeType != ExpressionType.Convert) { throw new ArgumentException("Invalid property expression.", "exp"); } body = convertExpression.Operand; } return ((MemberExpression)body).Member.Name; } 

用法:

 var x = new ObjectType(); // note that in this case we don't need to specify types of x and Property1 var propName1 = GetPropertyName(() => x.Property1); // assumes Property2 is an int property var propName2 = GetPropertyName(y => y.Property2); // requires only object type var propName3 = GetPropertyName(y => y.Property3); 

更新:修复了返回值类型的属性的GetPropertyName(Expression> exp)

上述就是C#学习教程:反思 – 获取属性名称分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 class Foo { public string Bar { get; set; } } class Program { static void Main() { var result = Get(x => x.Bar); Console.WriteLine(result); } static string Get(Expression> expression) { var me = expression.Body as MemberExpression; if (me != null) { return me.Member.Name; } return null; } } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/997177.html

(0)
上一篇 2021年12月26日
下一篇 2021年12月26日

精彩推荐