C# Dynamic Attribute Arguments

亡梦爱人 提交于 2019-11-28 08:47:48

问题


Is there a way to do the following? I see that the Attribute Arguments must be a constant expression, so how would I work around this? If I dont want to load some properties into a datagridview using binding, whats the next best alternative?

  class TestObj
  {
     private bool isBrowsable = false;

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

回答1:


You can provide dynamic custom type information at runtime by implementing the ICustomTypeDescriptor interface - but this is quite a bit of work at not nearly as simple as decorating properties with attributes.




回答2:


For runtime, I think that you are probably looking at ICustomTypeDescriptor. If it were a compile time decision, you could have used compiler directives:


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




回答3:


You can load value from some config file or database using approach similar to How to set dynamic value in my Attribute by passing class and property names, e.g.

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

However it will be annoying to type as string names, that are obvious and somehow should be able to determined from reflection. You can try to us IL Weaver tools, such as PostSharp or Fody.( I believe, that they capable to do such thinks, but don't have an example just now)☑



来源:https://stackoverflow.com/questions/1093466/c-sharp-dynamic-attribute-arguments

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!