我想根据 MyPropertySelected 显示MyProperty1
或MyProperty2
。如何使用基于 MyPropertySelected 的条件语句if
或else
?感谢。
// [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; }
答案 0 :(得分:5)
你把苹果与橘子混为一谈。
属性是元数据,属性值在运行时获取其值。
换句话说:属性是您可以使用 reflection 访问的内容,而且这些属性并不依赖于特定对象,而是与对象(即类)。
另一个问题是您希望根据在编译时无法工作的条件向属性添加属性。
您的MyPropertySelected
在其实例化之前不会获得任何值 - 这是创建一个对象,例如:MyClass a = new MyClass()
- ,意味着添加或者不添加属性永远不会是编译时选择。
我想说清楚:你不能完全使用属性做你想做的事情!
您无法根据运行时值有条件地应用属性。
最后,我怀疑你想根据条件制作一些Browsable
,就像你自己的问题所说的那样。你不能这样做。
您可以使用其他软件设计解决您的问题。
首先,创建一个具有任何可浏览属性的接口。但是不要将属性[Browsable(bool)]
应用于接口属性。
创建两个实现先前创建的接口的类。
在第一个类中,实现接口属性并在其上添加[Browsable(true)]
属性。在第二节课中,也要这样做,但这次会在[Browsable(false)]
上加上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
控件。
无论如何,您可以在您的案例中应用这个概念。 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;
}
}