在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;
}
}
答案 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中的答案,了解检查方法内容的一些选项。 (属性只是一种方法 - 如果您同时拥有get
和set
)