为什么实现接口的类的属性不起作用?

时间:2014-11-11 22:14:40

标签: c# interface

请说,我需要知道我错过了什么,或者我在使用以下代码做错了什么?

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 setter值没有执行,因为如果是这样那么X值应该变成10

3 个答案:

答案 0 :(得分:1)

似乎您应该捕获B的实例以进行验证,但使用您的确切代码,这对我有用:

编辑:来自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

答案 1 :(得分:0)

1 /首先应该实例化列表。

2 /你确定mDisplayMode!=值? 我的意思是当你在A上设置显示模式为“编辑”时,也许它已经是它的价值了。

答案 2 :(得分:0)

正如他们所说,你的代码应该没有任何问题

你可以发布原始代码,也许你遗漏了改变代码行为的东西吗?

如果您坚持不调用setter,则尝试使用反射调用它,例如

而不是(control as IMode).DisplayMode,您可以执行以下操作

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

希望这会对你有所帮助