C # - Альтернативный способ использования атрибута - PullRequest
1 голос
/ 02 декабря 2010

Допустим, я получил следующее:

public class A {
     [MyAttribute]
     public void Test() {}
}

Мне не нравится поведение добавления атрибута для префикса метода или класса с помощью [].Я думаю, это делает код менее читабельным.

Я считаю, что лучшим подходом может быть что-то вроде:

AddAttribute(A, Test, MyAttribute);

Есть ли способ сделать что-то подобное?

Потому что это своего рода добавление атрибута во время выполнения ...

Или есть другой способ использования атрибута?Как XML-файлы?

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

Атрибуты не могут быть добавлены во время выполнения, они встроены в метаданные сборки.Однако вы можете добавлять атрибуты с помощью внешнего инструмента во время сборки, который изменяет ваш исходный код перед компиляцией.

1 голос
/ 02 декабря 2010

Нет, универсального решения для замены атрибутов не существует.

Однако, есть и другие способы реализации вещей, предоставляемых атрибутами. Это действительно зависит от используемой вами платформы.

0 голосов
/ 02 декабря 2010

Это зависит от контекста; для некоторых сценариев , атрибуты на самом деле могут быть добавлены во время выполнения - но они отображаются только под TypeDescriptor (это то, что использует большинство привязок данных интерфейса пользователя), а не сырое отражение.

Например, для аннотирования типа :

TypeDescriptor.AddAttributes(typeof(Foo),
    new TypeConverterAttribute(typeof(ExpandableObjectConverter)));

для замены преобразователя типов для типа во время выполнения .

Вы также можете сделать несколько трюков со свойствами , но это режим много ... с трудом.

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


Следующее только для обсуждения; Я бы не стал этого делать только потому, что вам не нравится его внешний вид (хотя я сделал что-то подобное, чтобы помочь комментировать машинно-сгенерированный код):

файл 1

[Description("evil evil evil")]
partial class Foo {
    [Description("don't do this")]
    partial void Bar();
}

файл 2

partial class Foo {
    partial void Bar() {
        Console.WriteLine("I can only be called from inside the type; "
           + "I can't be public");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...