对于已知类型,重命名成员是安全的

本文关键字:成员 安全 重命名 类型 | 更新日期: 2023-09-27 18:06:41

假设我有以下代码(我需要将此代码片段包含在更复杂的表达式中的任何地方):

Type paraType = typeof(MyModel);
var member = paraType.GetMember("BlaBla");
MemberExpression myExp = l.Expression.MakeMemberAccess(incidentParameter, member[0]);
我已经知道MyModel有一个名为BlaBla的成员。我正在寻找一个更优雅的方式来反映这个已经知道的成员。

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

我想找一个类似类型的操作符:

typeof(MyClass) ->返回一个Type对象。如果我重命名"MyClass",我没有问题,因为引用也会自动重命名。

Andreas

对于已知类型,重命名成员是安全的

我经常使用这样的方法来获取成员的名称:

// <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)通过nameof操作符本地添加了此功能。万岁!

下面是关于一些用例的博客条目:http://www.mboros.blogspot.de/2012/05/magic-strings-member-names.html