2017-02-07 11 views
0

В C# можно ли проверить, имеет ли свойство Setter, который ссылается на другой объект во время выполнения?Можно ли проверить, имеет ли свойство 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

Я не уверен, что это лучший способ, однако, это может помочь вам:

// 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); 

Если равно, это означает, что вы имеете дело с случаем, в котором сеттер изменяет значение частного поля. Обратите внимание, что при работе с типами, отличными от строки, int и т. Д., Требуется особая осторожность.

+0

Возможно ли выполнить код, который вы опубликовали во время выполнения? – user3736648

+0

У вас возникли проблемы? Обратите внимание, что логика проста: сохраните копию класса, измените свойство, сравните его с сохраненной копией и посмотрите, что произошло. – Ron

+0

Ваш код нежизнеспособен, так как код должен выполняться на многих объектах во время выполнения без сохранения копии класса. Есть ли другой способ? – user3736648

0

Это очень сложный вопрос. Библиотека System.Reflection в .NET позволяет вам наблюдать подписи классов (типы, поля, методы и т. Д.), Вызывать их и получать их значения; но не видят в их теле.

Прочтите ответы в ответах this question на некоторые параметры для проверки содержимого методов. (свойство - это всего лишь метод - два, если у вас есть как get, так и set)