已知类型的 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
假设我有以下代码(我需要在更复杂的表达式中的任何位置包含此代码段)。
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