已知类型的 c# MemberExpression,重命名成员是安全的

c# MemberExpression for known type, be safe to renaming member

假设我有以下代码(我需要在更复杂的表达式中的任何位置包含此代码段)。

Type paraType = typeof(MyModel);
var member = paraType.GetMember("BlaBla");
MemberExpression myExp = l.Expression.MakeMemberAccess(incidentParameter, member[0]);

我已经知道 MyModel 有一个名为 BlaBla 的成员。我正在寻找一种更优雅的方式来反映这个 已知 成员。

在示例中,我将方法的名称 "BlaBla" 反映为字符串,并将 MethodInfo 传递给 MakeMemberAccess。但我不喜欢它,因为它容易出错,比如重命名等重构。如果有人(包括我)重命名 属性 "BlaBla",他很可能会忘记重命名此反射字符串。

我想要类似于 typeof 运算符的东西:

typeof(MyClass) -> returns 类型对象。如果我重命名 "MyClass",我没有问题,因为引用也会自动重命名。

问候

安德烈亚斯

我经常用这样的方式来获取会员的名字:

// <summary>
// Return the name of a static or instance property from a property access lambda expression.
// </summary>
// <typeparam name="T">Type of the property.</typeparam>
// <param name="propertyLambdaExpression">A lambda expression that refers to a property, in the
// form: '() => Class.Property' or '() => object.Property'</param>
// <returns>Return the name of the property represented by the provided lambda expression.</returns>
internal static string GetPropertyName<T>(System.Linq.Expressions.Expression<Func<T>> propertyLambdaExpression)
{
    var me = propertyLambdaExpression.Body as System.Linq.Expressions.MemberExpression;
    if (me == null) throw new ArgumentException("The argument must be a lambda expression in the form: '() => Class.Property' or '() => object.Property'");
    return me.Member.Name;
}

那么你可以这样使用它:

Type paraType = typeof(MyModel);
var member = paraType.GetMember(GetPropertyName(() => MyModel.BlaBlah));

注意:与任何事物一样,如果您的成员不是静态的,则您必须有一个实例来调用它,例如GetPropertyName(() => myModelInstance.BlaBlah).

更新: C#6.0 (VS 2015) 通过 the nameof operator 本机添加了此功能。万岁!

这是一篇关于一些用例的博客文章:http://www.mboros.blogspot.de/2012/05/magic-strings-member-names.html