0

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

// [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; }
4

2 回答 2

5

你把苹果和橙子混为一谈了。

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

换句话说:属性是您将使用反射访问的东西,它们与特定对象无关,而是与对象的类型(即)相关联。

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

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

我想明确一点:你不能纯粹使用属性来做你想做的事!

您不能有条件地基于运行时值应用属性

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

好吧好吧,但是什么...?

您可以使用不同的软件设计来解决您的情况。

1)

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

2)

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

在第一个类中,实现接口属性并[Browsable(true)]在它们上放置一个属性。在第二节课上,做同样的事情,但这次给[Browsable(false)]他们一个。

3)

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

也就是说,MyPropertySelected在两个类之外外部化并在调用者中执行整个条件切换。

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可以继承。您可以同时创建实现建议接口的派生类PropertyGrid1PropertyGrid2

于 2012-12-03T14:33:13.953 回答
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;
    }
}
于 2012-12-03T14:08:58.933 回答