字符串化成员名称,类似于 C 中 #define str(s) #s
本文关键字:str #define 成员 类似于 字符串 | 更新日期: 2023-09-27 18:31:45
有没有办法使用 #define str(s) #s
宏在 C# for .NET 4.0 中像在 C 中那样字符串化成员名称?
public Double MyDouble
{
get { return _MyDouble;}
set
{
_MyDouble = value;
RaisePropertyChanged("MyDouble");
// The below item would refactor correctly if C# had a stringify pre-processor
// RaisePropertyChanged(str(MyDouble));
}
}
private Double _MyDouble;
如果我禁用了 Search in Strings
重构,则重构会中断 raise 属性更改事件,如果启用,则会中断完全不相关的字符串。有时,直到 UI 元素不再响应更改,我才会注意到。
不,不幸的是。目前,您必须使用PostSharp或NotifyPropertyWeaver之类的东西才能可靠地执行此操作。
请注意,在 C# 5 中,您将能够执行以下操作:
public void RaisePropertyChanged([CallerMemberName] string member = "")
{
}
你会像这样使用它:
public Double MyDouble
{
get { return _MyDouble;}
set
{
_MyDouble = value;
RaisePropertyChanged();
}
}
C# 5 编译器将自动填写可选参数。
对于您的特定情况OnPropertyChanged
,您能做的最好的事情就是以下几点(尽管显然不理想)......
this.OnPropertyChanged(x => x.Member);
。和。。。
protected void OnPropertyChanged(Expression<Func<T, object>> property)
{
var propertyName = GetPropertyName(property.Body);
if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private static string GetPropertyName(Expression expression)
{
switch (expression.NodeType)
{
case ExpressionType.MemberAccess:
var memberExpression = (MemberExpression)expression;
var supername = GetPropertyName(memberExpression.Expression);
if (String.IsNullOrEmpty(supername))
return memberExpression.Member.Name;
return String.Concat(supername, '.', memberExpression.Member.Name);
case ExpressionType.Call:
var callExpression = (MethodCallExpression)expression;
return callExpression.Method.Name;
case ExpressionType.Convert:
var unaryExpression = (UnaryExpression)expression;
return GetPropertyName(unaryExpression.Operand);
case ExpressionType.Parameter:
return String.Empty;
default:
throw new ArgumentException();
}
}
。沿着这些思路....
我不
熟悉 C 结构,但它听起来非常像 C# 6 中引入的 nameof
关键字,即
用于获取变量的简单(非限定)字符串名称, 类型或成员。
如果我们将其连接:
public Double MyDouble
{
get { return _MyDouble; }
set
{
_MyDouble = value;
RaisePropertyChanged(nameof(MyDouble));
}
}
。并设置一个属性值,RaisePropertyChanged
接收一个字符串参数"MyDouble"。