0

#define str(s) #sマクロを使用して C で行うように、.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 property changed イベントを壊します。UI 要素が変更に応答しなくなるまで気付かないことがあります。

4

3 に答える 3

7

いいえ、残念ながら。現在、これを確実に行うには、 PostSharp やNotifyPropertyWeaverなどを使用する必要があります。

C# 5 では、これを実行できることに注意してください。

public void RaisePropertyChanged([CallerMemberName] string member = "")
{
}

そして、次のように使用します。

public Double MyDouble
{
    get { return _MyDouble;}
    set 
    { 
        _MyDouble = value; 
        RaisePropertyChanged();
    }
}

また、C# 5 コンパイラは、オプションのパラメーターを自動的に入力します。

于 2012-04-20T19:05:26.667 に答える
2

あなたができる最善の特定のケースについて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();
    }
}

...これらの線に沿って....

于 2012-04-20T19:14:25.657 に答える