gpt4 book ai didi

c# MemberExpression 对于已知类型,可以安全地重命名成员

转载 作者:行者123 更新时间:2023-12-03 20:34:36 29 4
gpt4 key购买 nike

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

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

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

在示例中,我通过名称“BlaBla”将方法反射(reflect)为字符串,并将 MethodInfo 传递给 MakeMemberAccess。但我不喜欢它,因为它很容易出现重命名等重构错误。如果任何人(包括我)将属性重命名为“BlaBla”,他很可能也会忘记重命名该反射字符串。

我正在寻求类似于 typeof 运算符的东西:

typeof(MyClass) -> 返回一个 Type 对象。如果我重命名“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 原生添加了此功能。万岁!

关于c# MemberExpression 对于已知类型,可以安全地重命名成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31834497/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com