2014-11-11 3 views
1

Просьба, мне нужно знать, чего я не вижу, или что я делаю неправильно со следующим кодом?Почему свойство класса, реализующего интерфейс, не работает?

public class Program 
{ 
    public static void Main() 
    { 
     var a = new A(); 
     a.Controls.Add(new B()); 
     a.Controls.Add(new C()); 
     a.Controls.Add(new D()); 
     a.DisplayMode = DisplayMode.Edit; 
    } 
} 
public enum DisplayMode 
{ 
    View = 0, 
    Edit = 1 
} 

public interface IMode 
{ 
    DisplayMode DisplayMode { get; set; } 
} 

public class A 
{ 
    private DisplayMode mDisplayMode; 
    public A() 
    { 
     mDisplayMode = DisplayMode.View; 
     Controls = new List<object>(); 
    } 
    public DisplayMode DisplayMode 
    { 
     get 
     { 
      return mDisplayMode; 
     } 
     set 
     { 
      if (mDisplayMode != value) 
      { 
       mDisplayMode = value; 
       foreach (var control in Controls) 
        if (control is IMode) 
         (control as IMode).DisplayMode = value; 
       // the control (b).DisplayMode is not firing or executing the set 
       // what i am missing here? 
      } 
     } 
    } 
    public List<object> Controls { get; set; } 
} 

public class B : IMode 
{ 
    private DisplayMode mDisplayMode; 
    public B() 
    { 
     X=0; 
     mDisplayMode=DisplayMode.View; 
    } 

    public int X { get ; set;} 

    public DisplayMode DisplayMode 
    { 
     get 
     { 
      return mDisplayMode; 
     } 
     set 
     { 
      if (mDisplayMode != value) 
      { 
       mDisplayMode = value; 
       // some code should be executed; 
       X=10; 
      } 
     } 
    } 
} 

public class C {} 

public class D {} 

после того, как я называю a.DisplayMode=DisplayMode.Edit я ожидал, что все элементы управления (B) будет исполнять набор DisplayMode, но после выполнения кода, его не стрелять по всем

, что я имею в виду под значением сеттер DisplayMode не выполняется, потому что если тогда, то значение X должно стать 10

+0

Вы уверены, что у вас есть экземпляр 'B' в коллекции управления? – xxbbcc

+1

как вы не получили исключение NullReferenceException с этим кодом? вы не инициализируете Controls.Also DisplayMode - это перечисление и никогда не может быть нулевым. –

+0

Измените свое объявление Controls на 'public List Элементы управления {get; задавать; } ' – Rahul

ответ

0

, как они говорят, ваш код должен работать без каких-либо проблем

вы можете разместить свой исходный код, может быть, вам не хватает чего-то, что меняет поведение вашего кода?

, если вы настаиваете, что сеттер не вызывается затем попытаться вызвать его с помощью отражения, например

вместо (control as IMode).DisplayMode, вы можете сделать следующее

var type=control.GetType(); 
var property=type.GetProperty("DisplayMode"); 
property.SetValue(control,value,null); 

надеюсь, что это поможет вам

0

1/Сначала вы должны создать экземпляр списка.

2/Вы уверены, что mDisplayMode! = Значение? Я имею в виду, когда вы устанавливаете режим отображения для «редактирования» на A, возможно, это уже его значение.

1

Похоже, вы должны захватить экземпляр B для того, чтобы проверить, но используя ваш точный код, это работает для меня:

EDIT: Обновлен код из образца OP, где B имеет свойство X, который получает набор когда DisplayMode изменения:

var a = new A(); 
var b = new B(); 

Console.WriteLine("Starting value of b Properties:"); 
Console.WriteLine(" - b.DisplayMode ... {0}", b.DisplayMode); 
Console.WriteLine(" - b.X ............. {0}", b.X); 

a.Controls.Add(b); 
a.DisplayMode = DisplayMode.Edit; 

Console.WriteLine("Ending value of b Properties:"); 
Console.WriteLine(" - b.DisplayMode ... {0}", b.DisplayMode); 
Console.WriteLine(" - b.X ............. {0}", b.X);  

// Ouput: 
// Starting value of b Properties: 
// - b.DisplayMode ... View 
// - b.X ............. 0 
// Ending value of b Properties: 
// - b.DisplayMode ... Edit 
// - b.X ............. 10 
+0

уверен, что он будет работать, но сеттер внутри B не будет выполнен, потому что должен выполняться другой код, например, любезно добавить свойство integer, называемое X, и по умолчанию X = 0 и когда установщик B должен max X = 10; в конце вы найдете b.DisplayMode изменен и X по-прежнему 0 – mah

+1

@mah Это не так ...вызывается вызывающий вызов (как иначе значение будет установлено set?), а X обновляется. Я обновил свой образец на основе вашего последнего изменения кода. –

Смежные вопросы