C# 动态属性参数

4

有没有办法实现以下功能?我看到属性参数必须是常量表达式,那么我该如何解决这个问题?如果我不想使用绑定将某些属性加载到DataGridView中,下一个最好的选择是什么?

  class TestObj
  {
     private bool isBrowsable = false;

     [Browsable(isBrowsable)]
     public string String1
     {
        get
        {
           return "Foo";
        }
     }
     [Browsable(isBrowsable)]
     public string String2
     {
        get
        {
           return "Baz";
        }
     }
  }

你想在编译时还是运行时决定这个? - lc.
3个回答

7

您可以通过实现ICustomTypeDescriptor接口在运行时提供动态的自定义类型信息,但这需要进行相当多的工作,远不如使用属性来装饰简单。


你有一个快速的例子或者一个展示如何做到这一点的网站吗?谢谢。 - SwDevMan81
这是一个使用接口本地化网格的示例。http://www.codeguru.com/csharp/csharp/cs_controls/propertygrid/article.php/c4795 - Daniel Brückner

3

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


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


0

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

[IsBrowsable("classname", "propertyname")]

但是,将字符串名称作为参数输入会非常麻烦。这些名称显然应该能够通过反射确定。您可以尝试使用 IL Weaver 工具,例如 PostSharp 或 Fody。(我相信它们能够实现这样的功能,但现在没有例子)☑


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接