我有一个基类,需要处理派生类属性的名称(显式访问)。为此,我创建了一个将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
方法不会返回任何内容,因为我只是在分析MemberExpression
或UnaryExpression
。
答案 0 :(得分:5)
如何限制GetMemberName方法,使其只能接受从我的基类派生的类的成员?
不清楚你的意思&#34;接受&#34;在这里,但如果你试图将有效的lambda表达式集限制为使用你的类成员的那些,你就不能这样做。 Lambda表达式和表达式树恰好对于获取这些信息很有用,但这并不是他们设计的内容,因此没有特定的功能可以满足这一要求。您始终可以使用不仅仅使用属性的lambda表达式。
最简单的方法可能只是在执行时检查它。你无法阻止人们在编译时滥用你的方法,但只要你做正确的事情很简单,我也不会担心很多关于调用者做错误的事情 - 只是让错误信息真的很清楚。