如何在属性属性上使用条件语句IF ELSE

时间:2012-12-03 14:05:27

标签: c# winforms properties attributes conditional-operator

我想根据 MyPropertySelected 显示MyProperty1MyProperty2。如何使用基于 MyPropertySelected 的条件语句ifelse?感谢。

// [Browsable(true)
// ????? conditional statement IF ELSE in here..
// IF (MyPropertySelected) MyProperty1 will be show ELSE MyProperty2 will be show.
public bool MyPropertySelected { get; set; }

// [Browsable(true) or [Browsable(false) depending on MyPropertySelected condition.
public int MyProperty1 { get; set; }

// [Browsable(true) or [Browsable(false) depending on MyPropertySelected condition.
public int MyProperty2 { get; set; }

2 个答案:

答案 0 :(得分:5)

你把苹果与橘子混为一谈。

属性是元数据,属性值在运行时获取其值

换句话说:属性是您可以使用 reflection 访问的内容,而且这些属性并不依赖于特定对象,而是与对象(即)。

另一个问题是您希望根据在编译时无法工作的条件向属性添加属性。

您的MyPropertySelected在其实例化之前不会获得任何值 - 这是创建一个对象,例如:MyClass a = new MyClass() - 意味着添加或者不添加属性永远不会是编译时选择

我想说清楚:你不能完全使用属性做你想做的事情!

您无法根据运行时值有条件地应用属性。

最后,我怀疑你想根据条件制作一些Browsable,就像你自己的问题所说的那样。你不能这样做。

好的,但是......?

您可以使用其他软件设计解决您的问题。

1)

首先,创建一个具有任何可浏览属性的接口。但是不要将属性[Browsable(bool)]应用于接口属性。

2)

创建两个实现先前创建的接口的类。

在第一个类中,实现接口属性并在其上添加[Browsable(true)]属性。在第二节课中,也要这样做,但这次会在[Browsable(false)]上加上MyPropertySelected

3)

创建对象实例的一些代码也将决定将实例化哪一个

即,在两个类之外外化public interface IBrowsableProperties { int Property1 { get;set; } int Property2 { get;set; } } public class A : IBrowsableProperties { [Browsable(true)] public int Property1 { get;set; } [Browsable(true)] public int Property1 { get;set; } } public class B : IBrowsableProperties { [Browsable(false)] public int Property1 { get;set; } [Browsable(false)] public int Property1 { get;set; } } // Somewhere in some method... bool propertySelected = true; IBrowsableProperties instance = null; if(propertySelected) { instance = new A(); } else { instance = new B(); } // ... do stuff with your instance of IBrowsableProperties! 并在调用者中执行整个条件切换。

PropertyGrid

更新

我已经审核了您的一些问题的评论,并且我发现您正在使用PropertyGrid控件。

无论如何,您可以在您的案例中应用这个概念。 PropertyGrid1可以继承。您可以创建同时实现建议接口的PropertyGrid2和{{1}}派生类!

答案 1 :(得分:2)

你可能想要一个像这样的中介属性:

class Foo
{
    public bool MyPropertySelected
    {
        get;
        set;
    }

    public readonly int MyProperty
    {
        get 
        {
            return MyPropertySelected ? MyProperty1 : MyProperty2;
        }
    }

    private int MyProperty1
    {
        get;
        set;
    }

    private int MyProperty2
    {
        get;
        set;
    }
}