1

プロパティを指定して文字列表現を取得したいと思います。このようにして、この文字列を使用してNotifyPropertyChanged、プロパティの名前をリファクタリングした後でも問題ありません。

編集:私は.NET 4.0を使用しています

更新: s の名前も利用できるようにしたいと思いますDependencyProprty。つまり、静的変数の割り当て時に値が必要です。

説明する同じサンプル コード:

// actual code

private int prop = 42;
public int Prop
{
    get
    {
        return prop;
    }
    set
    {
        prop = value;
        NotifyPropertyChanged("Prop"); // I'd like to replace the hard-coded string here
    }
}


// code as I'd like it to be

private int propNew = 42;
private static readonly string PropNewName = GainStringFromPropertySomeHow(PropNew); // should be "PropNew"
public int PropNew
{
    get
    {
        return propNew;
    }
    set
    {
        propNew = value;
        NotifyPropertyChanged(PropNewName); // <== will remain correct even if PropNew name is changed
    }
}

リファクタリング後:

private int prop = 42;
public int PropNameChanged
{
    get
    {
        return prop;
    }
    set
    {
        prop = value;
        NotifyPropertyChanged("Prop"); // oops
    }
}


private int propNew = 42;
private static readonly string PropNewName = GainStringFromPropertySomeHow(PropNewNameChanged); // should be "PropNewNameChanged"
public int PropNewNameChanged
{
    get
    {
        return propNew;
    }
    set
    {
        propNew = value;
        NotifyPropertyChanged(PropNewName); // still correct
    }
}
4

4 に答える 4

1

まだ .Net 4.5 を使用していないために CallerMemberName を使用できない場合は、次のアプローチを使用できます: https://stackoverflow.com/a/3191598/869250

于 2013-08-01T09:04:59.513 に答える
1

これは、リフレクションを介して現在のプロパティ名を取得する方法の複製です?

だからあなたはこれを行うことができます

NotifyPropertyChanged(MethodBase.GetCurrentMethod().Name);
于 2013-08-01T09:05:19.090 に答える
0

Stackoverflowで解決策を見つけました:

https://stackoverflow.com/a/672212/1254743

https://stackoverflow.com/a/2820759/1254743

結果のコード:

public static class PropertyNameExtractor
{
    /// <summary>
    /// Usage: PropertyNameExtractor.ExposeProperty(() => this.YourProperty)
    /// yields: "YourProperty"
    /// </summary>
    public static string ExposeProperty<T>(Expression<Func<T>> property)
    {
        var expression = GetMemberInfo(property);
        return expression.Member.Name;

    }

    private static MemberExpression GetMemberInfo(Expression method)
    {
        LambdaExpression lambda = method as LambdaExpression;
        if (lambda == null)
            throw new ArgumentNullException("method");

        MemberExpression memberExpr = null;

        if (lambda.Body.NodeType == ExpressionType.Convert)
        {
            memberExpr =
                ((UnaryExpression)lambda.Body).Operand as MemberExpression;
        }
        else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
        {
            memberExpr = lambda.Body as MemberExpression;
        }

        if (memberExpr == null)
            throw new ArgumentException("method");

        return memberExpr;
    }

}

私のクラスで:

class MyClass: INotifyPropertyChanged
{
    public MyClass()
    {
        this.nameOf_MyProperty = PropertyNameExtractor.ExposeProperty(() => this.MyProperty);

    }


    private readonly string nameOf_MyProperty;
    private int myProperty = 42 ;
    public int MyProperty
    {
        get
        {
            return myProperty;
        }
        set
        {
            myProperty= value;
            NotifyPropertyChanged(nameOf_MyProperty);
        }
    }

    private void NotifyPropertyChanged(String PropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }
}
于 2013-08-01T09:05:11.347 に答える