获取在.NET 3.5中使用的Lambda表达式中的属性名称

20 浏览
0 Comments

获取在.NET 3.5中使用的Lambda表达式中的属性名称

我有一个问题困扰我已经很长时间了,但是找不到答案。

我需要获取在Lambda表达式中引用的属性名称。我会将Lambda表达式提供给一个方法,该方法会返回一个字符串。例如,如果我有:

x => x.WeirdPropertyName

那么该方法将返回:

"WeirdPropertyName"

我已经阅读到可以使用表达式树来实现,但是答案一直逃避我。

感谢任何帮助。

0
0 Comments

问题是:在.NET 3.5中,如何从Lambda表达式中获取属性名?

解决方法如下:

// code adjusted to prevent horizontal overflow
static string GetFullPropertyName(Expression> exp)
{
    MemberExpression memberExp;
    if (!TryFindMemberExpression(exp.Body, out memberExp))
        return string.Empty;
    var memberNames = new Stack();
    do
    {
        memberNames.Push(memberExp.Member.Name);
    }
    while (TryFindMemberExpression(memberExp.Expression, out memberExp));
    return string.Join(".", memberNames.ToArray());
}
// code adjusted to prevent horizontal overflow
private static bool TryFindMemberExpression(Expression exp, out MemberExpression memberExp)
{
    memberExp = exp as MemberExpression;
    if (memberExp != null)
    {
        // heyo! that was easy enough
        return true;
    }
    // if the compiler created an automatic conversion,
    // it'll look something like...
    // obj => Convert(obj.Property) [e.g., int -> object]
    // OR:
    // obj => ConvertChecked(obj.Property) [e.g., int -> long]
    // ...which are the cases checked in IsConversion
    if (IsConversion(exp) && exp is UnaryExpression)
    {
        memberExp = ((UnaryExpression)exp).Operand as MemberExpression;
        if (memberExp != null)
        {
            return true;
        }
    }
    return false;
}
private static bool IsConversion(Expression exp)
{
    return (
        exp.NodeType == ExpressionType.Convert ||
        exp.NodeType == ExpressionType.ConvertChecked
    );
}

以上是从Stack Overflow上的回答中整理出的代码,用于从Lambda表达式中获取属性名。

0
0 Comments

在.NET 3.5中,有一个问题是如何从Lambda表达式中获取属性名。上面的代码提供了一个解决方法。

问题的原因是,在.NET 3.5中,Lambda表达式无法直接从中获取属性名。Lambda表达式只能被编译成委托,而无法直接访问其内部的成员。

解决方法是通过使用表达式树(Expression Tree)来获取属性名。表达式树是一个具有层次结构的代码表示形式,可以用来表示Lambda表达式中的成员访问。

在上面的代码中,我们定义了一个泛型方法GetPropertyName,用于获取Lambda表达式中的属性名。该方法接受一个Expression>类型的参数property,并返回属性名。

方法的实现过程如下:

1. 首先,我们将property的Body转换为MemberExpression类型,并将其转换为PropertyInfo类型的变量propertyInfo。这样,我们就可以访问属性的信息。

2. 然后,我们检查propertyInfo是否为null。如果为null,说明Lambda表达式指向的不是一个有效的属性,我们将抛出一个ArgumentException异常。

3. 最后,我们返回propertyInfo的Name属性,即属性的名称。

通过使用上述方法,我们可以方便地从Lambda表达式中获取属性名。这在一些需要根据属性名进行操作的场景中非常有用,比如属性的动态访问和反射等。

在.NET 3.5中,Lambda表达式无法直接从中获取属性名。通过使用表达式树,我们可以实现一个泛型方法GetPropertyName,用于从Lambda表达式中获取属性名。该方法将Lambda表达式的Body转换为MemberExpression类型,并将其转换为PropertyInfo类型的变量propertyInfo,然后返回属性名。这样,我们就可以方便地在需要根据属性名进行操作的场景中使用Lambda表达式。

0
0 Comments

在.NET 3.5中,我们想要获取Lambda表达式中使用的属性名称时,唯一的方法是通过反射来实现。

反射是一种强大的机制,可以在运行时检查类型信息并动态调用成员。通过使用反射,我们可以获取属性的名称,即使在Lambda表达式中也是如此。

然而,在.NET 3.5中,没有直接的方法来获取Lambda表达式中使用的属性名称。这可能会导致一些困扰,因为在某些情况下,我们可能需要根据属性名称执行一些特定的操作。

幸运的是,我们可以通过一些技巧来解决这个问题。以下是一种解决方法:

1. 创建一个表达式树:

Expression> expression = (T obj) => obj.PropertyName;

2. 将表达式树转换为成员表达式:

MemberExpression memberExpression = (MemberExpression)expression.Body;

3. 获取成员表达式的成员信息:

MemberInfo memberInfo = memberExpression.Member;

4. 获取成员信息的名称:

string propertyName = memberInfo.Name;

通过上述步骤,我们可以获取Lambda表达式中使用的属性名称。这样,我们就可以根据属性名称执行一些特定的操作,而无需手动输入属性名称。

这种解决方法可能会有一些限制,因为它需要使用表达式树和反射来实现。但是,在.NET 3.5中,这是获取Lambda表达式中属性名称的可行方法。

总结起来,通过使用反射和表达式树,我们可以在.NET 3.5中获取Lambda表达式中使用的属性名称。这为我们在根据属性名称执行特定操作时提供了便利。

0