首页 >后端开发 >C++ >如何从C#中的lambda表达式中有效地检索属性名称?

如何从C#中的lambda表达式中有效地检索属性名称?

Barbara Streisand
Barbara Streisand原创
2025-02-01 05:51:09720浏览

How Can I Efficiently Retrieve Property Names from Lambda Expressions in C#?

从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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn