Аргументы динамических атрибутов C#
-
11-09-2019 - |
Вопрос
Есть ли способ сделать следующее?я видеть что аргументы атрибута должны быть постоянным выражением, и как мне обойти это?Если я не хочу загружать некоторый свойства в 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. (Я верю, что они способны на такое, но сейчас у меня нет примера)☑