如何打开对象属性的属性名称?

时间:2017-12-29 18:23:47

标签: c# wpf

我真的非常非常讨厌拥有魔法弦乐。并且switch语句非常方便,尤其是在与nameof()配对时。但是,我遇到了打开传入属性类型的问题。

在我的wpf应用程序中,我将网格列绑定到对象的属性。因此,当触发ShowingEditor事件时,遇到的e.Column.FieldName与我的绑定中的值相同。但是,我无法解决如何关闭该名称的问题。

以下是一些说明问题的示例代码。

public class Program
{
    public class A
    {
        public B AStringValue
        {
            get;
            set;
        }

        public int IntValue
        {
            get;
            set;
        }
    }

    public class B
    {
        public string StringValue
        {
            get;
            set;
        }
    }

    public static void Main()
    {
        string input = "AStringValue.StringValue";
        switch (input)
        {
            case nameof(A.AStringValue.StringValue): // want to be "AStringValue.StringValue"
                break;
        }
    }
}

如何通过直接引用类型来打开对象属性的属性名称?虽然我当然可以在事件处理程序中硬编码属性的名称,但我想尽可能避免这种情况。使用对属性名称的直接引用意味着如果我在一个位置重命名它,我可以依赖我的IDE在其他用例中重命名它而不会破坏我的代码。

1 个答案:

答案 0 :(得分:0)

public static string GetName<TSource>(Expression<Func<TSource, object>> lambda)
{
    var code = lambda.Body.ToString();
    var match = Regex.Match(code, @"^\w+\.((?:\w+\.)*\w+)$");
    if (!match.Success)
        throw new ArgumentException("Unexpected expression tree");

    return match.Groups[1].Value;
}

你这样使用它: GetName<A>(q => q.AStringValue.StringValue)

此代码获取实际表达式树的字符串表示形式。它很容易在很多情况下给出不希望的结果(方法访问,使用局部变量...),因此正则表达式确保输出符合您的预期。

当然还有性能成本。为避免分析lambda并在每个选项的每个调用上运行正则表达式,您应该缓存结果而不是使用开关。