Вопрос

Есть ли способ сделать следующее?я видеть что аргументы атрибута должны быть постоянным выражением, и как мне обойти это?Если я не хочу загружать некоторый свойства в 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

Вы можете загрузить значение из какого-либо файла конфигурации или базы данных, используя подход, аналогичныйКак установить динамическое значение в моем атрибуте передавая имена классов и свойств, например.

[IsBrowsable("имя класса", "имя свойства")]

Однако будет неприятно вводить имена строк, которые очевидны и каким-то образом должны быть определены на основе отражения.Вы можете попробовать использовать инструменты IL Weaver, такие как PostSharp или Fody. (Я верю, что они способны на такое, но сейчас у меня нет примера)☑

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top