是否可以检查属性是否具有引用另一个对象的Setter?

时间:2017-02-07 02:18:21

标签: c# properties getter-setter

在C#中,是否可以检查属性是否具有在运行时引用另一个对象的Setter?

以下是一些代码:

private PropertyChanged _propertyChanged;
public string PropertyChangedName
{
    get
    {
        return _propertyChanged.Name;
    }
    set
    {
        _propertyChanged.Name = value;
    }
}

在上面的代码中,PropertyChangedName被引用为PropertyChanged对象的一部分。设置PropertyChangedName时,会设置_propertyChanged.Name。

以下是一些代码,其中PropertyChangedName未作为PropertyChanged对象的一部分引用:

private string _propertyChangedName;
public string PropertyChangedName
{
    get
    {
        return _propertyChangedName;
    }
    set
    {
        _propertyChangedName = value;
    }
}

3 个答案:

答案 0 :(得分:0)

我不确定这是最好的方法,但是,它可能对你有帮助:

// store the current state:
var valuesbefore = new List<object>();
foreach (var r in this.GetType().GetFields(System.Reflection.BindingFlags.NonPublic))
    valuesbefore.Add(r.GetValue(this));

// change the value the specified property
PropertyChangedName = PropertyChangedName + "a"; 

//get the new state of the class:
var valuesnow = new List<object>();
foreach (var r in this.GetType().GetFields(System.Reflection.BindingFlags.NonPublic))
    valuesnow.Add(r.GetValue(this));

// check for any change
bool equal = valuesbefore.SequenceEqual(valuesnow);

如果 equal 为false,则表示您正在处理setter更改private字段值的情况。请注意,在处理string,int等以外的类型时需要特别小心。

答案 1 :(得分:0)

您可以实施INotifyPropertyChanged并订阅它。

答案 2 :(得分:0)

这是一个非常棘手的问题。 .NET中的System.Reflection库允许您观察类签名(类型,字段,方法等),调用它们并获取它们的值;但是没有看到他们的身体。

阅读this question中的答案,了解检查方法内容的一些选项。 (属性只是一种方法 - 如果您同时拥有getset

,则为两种方法