我真的非常非常讨厌拥有魔法弦乐。并且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在其他用例中重命名它而不会破坏我的代码。
答案 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并在每个选项的每个调用上运行正则表达式,您应该缓存结果而不是使用开关。