你把苹果和橙子混为一谈了。
属性是元数据,属性值在运行时获取其值。
换句话说:属性是您将使用反射访问的东西,它们与特定对象无关,而是与对象的类型(即类)相关联。
另一个问题是您希望根据无法在编译时工作的条件向属性添加属性。
在它的封闭类被实例化之前,您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
可以继承。您可以同时创建实现建议接口的派生类PropertyGrid1
!PropertyGrid2