C#动态属性参数

有没有办法做到以下几点? 我看到属性参数必须是一个常量表达式,那么我将如何解决这个问题呢? 如果我不想使用绑定将某些属性加载到datagridview中,那么下一个最佳替代方案是什么?

class TestObj { private bool isBrowsable = false; [Browsable(isBrowsable)] public string String1 { get { return "Foo"; } } [Browsable(isBrowsable)] public string String2 { get { return "Baz"; } } } 

您可以通过实现ICustomTypeDescriptor接口在运行时提供动态自定义类型信息 – 但这是一项相当多的工作,并不像使用属性装饰属性那么简单。

对于运行时,我认为您可能正在查看ICustomTypeDescriptor。 如果是编译时决定,您可以使用编译器指令:

#define ISBROWSABLE #if ISBROWSABLE [your attribute] #endif
#define ISBROWSABLE #if ISBROWSABLE [your attribute] #endif 

您可以使用类似于如何通过传递类和属性名称在我的属性中设置动态值的方法从某个配置文件或数据库加载值,例如

[IsBrowsable(“classname”,“propertyname”)]

然而,键入字符串名称会很烦人,这很明显,并且应该能够从reflection中确定。 您可以尝试使用IL Weaver工具,例如PostSharp或Fody。(我相信,他们能够做到这一点,但是现在没有示例)☑