Как сделать ссылку на метод в параметре атрибута - PullRequest
6 голосов
/ 26 февраля 2012

Я хочу создать атрибут, который позволит мне указать метод, применяемый к свойству, например:

public class MyClass
{
    [MyAttribute(Converter="ConverterMethod")]
    public string Prop { get; set; }

    public static string ConverterMethod(string src)
    {
        return src + " converted";
    }
}

Каков «правильный» способ сделать это?

Вот способы, которые я вижу:

  1. Создать строковое свойство и извлечь соответствующий метод с отражением во время выполнения
  2. Сделать Dictionary<string, Func<string, string>> и заполнить его соответствующими методами во время выполнения. Затем извлеките метод, используя строковое свойство атрибута в качестве ключа. Этот метод более устойчив к рефакторингу, если я переименую метод, все будет работать (ключ словаря останется прежним)
  3. Создать интерфейс 'IConverter' и передать typeof(ConverterImpl) в атрибут. Затем создайте экземпляр конвертера во время выполнения и используйте его интерфейс для преобразования значений. Этот способ кажется мне лучшим, но я никогда не использовал Type свойства в атрибутах и ​​даже не знаю, хорошо ли они сериализуются.

Какой подход лучше? Есть ли другие подходы? Как люди обычно делают такие вещи?

1 Ответ

2 голосов
/ 26 февраля 2012

Первый вариант довольно обычный и имеет преимущество простоты. Вы правы, говоря, что он немного подвержен рефакторингу, но ... это редко "настоящая" проблема.

Другой (четвертый) подход, однако, заключался бы в том, чтобы сделать атрибут абстрактным с помощью абстрактного метода и создать для него подкласс с кодом преобразования в атрибуте - тогда во время выполнения вы можете получить атрибут (как базовый атрибут) и просто вызовите виртуальный метод, этот подход распространен в таких вещах, как MVC.

Лично я обычно просто использую первый вариант вместе с юнит-тестами на безопасность (в случае рефакторинга и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...