将lambda表达式参数限制为类的属性

时间:2013-12-16 08:48:25

标签: c# lambda

我有一个基类,需要处理派生类属性的名称(显式访问)。为此,我创建了一个将lambda表达式作为输入的方法:

private string GetMemberName(Expression<Func<object>> expression)
{
    //gets the property name (MemberExpression or UnaryExpression)
    //out of scope
    return propertyName;
}

这允许我像这样调用方法:

derived.GetMemberName(() => derived.MyPropertyInt);
derived.GetMemberName(() => derived.MyPropertyStr);

问题是object根本不是限制性的。我也可以打电话:

derived.GetMemberName(() => "something"); //does not "return" anything but compiles (out of scope)
derived.GetMemberName(() => anotherClass.RandomMember); //not derived from "base"

如何限制GetMemberName方法,以便它只接受从我的基类派生的类的成员作为输入?设置GetMemberName(Expression<Func<MyBaseClass>> expression)会限制对整个班级的访问。设置GetMemberName(Expression<Func<MyBaseClass, object>> expression)会限制对当前实例的访问,但仍允许传递“随机”对象。

编辑: derived.GetMemberName(() => "something");的注释是在返回属性名称的上下文中,而不是lambda表达式的“值”。 GetPropertyName方法不会返回任何内容,因为我只是在分析MemberExpressionUnaryExpression

1 个答案:

答案 0 :(得分:5)

  

如何限制GetMemberName方法,使其只能接受从我的基类派生的类的成员?

不清楚你的意思&#34;接受&#34;在这里,但如果你试图将有效的lambda表达式集限制为使用你的类成员的那些,你就不能这样做。 Lambda表达式和表达式树恰好对于获取这些信息很有用,但这并不是他们设计的内容,因此没有特定的功能可以满足这一要求。您始终可以使用不仅仅使用属性的lambda表达式。

最简单的方法可能只是在执行时检查它。你无法阻止人们在编译时滥用你的方法,但只要你做正确的事情很简单,我也不会担心很多关于调用者做错误的事情 - 只是让错误信息真的很清楚。