字符串化成员名称,类似于 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 元素不再响应更改,我才会注意到。

字符串化成员名称,类似于 C 中 #define str(s) #s

不,不幸的是。目前,您必须使用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"。