从Lambda表达式中高效获取属性名称
在C#中,通过Lambda表达式传递属性名称通常比较棘手,尤其当属性以字符串形式表示时。一种常见的解决方法是将Lambda表达式转换为成员表达式,但这仅适用于字符串属性。
改进方案
为了克服现有方法的局限性,我们提出一种通用的方法,该方法返回指定表达式的PropertyInfo
对象。如果表达式不代表属性,则抛出异常。
<code class="language-csharp">public static PropertyInfo GetPropertyInfo<TSource, TProperty>( TSource source, Expression<Func<TSource, TProperty>> propertyLambda) { if (propertyLambda.Body is not MemberExpression member) { throw new ArgumentException(string.Format( "表达式 '{0}' 指向方法,而非属性。", propertyLambda.ToString())); } if (member.Member is not PropertyInfo propInfo) { throw new ArgumentException(string.Format( "表达式 '{0}' 指向字段,而非属性。", propertyLambda.ToString())); } Type type = typeof(TSource); if (propInfo.ReflectedType != null && type != propInfo.ReflectedType && !type.IsSubclassOf(propInfo.ReflectedType)) { throw new ArgumentException(string.Format( "表达式 '{0}' 指向的属性不属于类型 {1}。", propertyLambda.ToString(), type)); } return propInfo; }</code>
此方法使用source
参数进行类型推断,并接受Expression<Func<TSource, TProperty>>
形式的Lambda表达式。
实际示例
以下示例演示了此改进方法的用法:
<code class="language-csharp">var propertyInfo = GetPropertyInfo(someUserObject, u => u.UserID);</code>
此方法提供了一种更健壮和通用的方式来从Lambda表达式中提取属性信息。
以上是如何从C#中的lambda表达式中有效地检索属性名称?的详细内容。更多信息请关注PHP中文网其他相关文章!