Используйте лямбду в конструкторе атрибутов, чтобы получить параметры метода - PullRequest
1 голос
/ 16 июня 2010

Я даже не уверен, возможно ли это, но я исчерпал все свои идеи, пытаясь выяснить это, поэтому я решил отправить это сообществу и посмотреть, что вы думаете. И, если это невозможно, возможно, у вас тоже есть идеи.

Я пытаюсь создать класс Attribute, который можно добавить к методу, который позволил бы мне использовать лямбда-выражение для получения каждого параметра метода


public ExampleAttribute : Attribute 
{
    public object Value { get; set; }

    public ExampleAttribute(--something here to make the lambda work--, object value)
    {
        Value = value;
    }
}

Я бы хотел иметь что-то вроде этого ниже:


[Example(x=>x.Id, 4)]
[Example(x=>x.filter, "string value")]
public ActionResult Index(int Id, string filter) 
{
    return View();
}

Я понимаю, что, возможно, мне снится эта идея. Я в основном пытаюсь написать модель для самодокументирования документации REST API. В недавнем проекте здесь, на работе, мы написали около дюжины сервисов с 5-15 методами на каждом, я думаю, что проще написать что-то для этого, чем написать код для каждой страницы документации. Я планирую в конечном итоге выпустить его как проект с открытым исходным кодом, как только у меня будет такое место, где я чувствую, что его можно выпустить.

Ответы [ 5 ]

5 голосов
/ 16 июня 2010

Я не верю, что это возможно, но я не думаю, что вам все равно это нужно. Вместо этого вы можете поместить атрибут непосредственно в параметры, например так:

public ActionResult Index(
    [Documentation("the identifier...")]
    int id,

    [Documentation("The filter")]
    string filter
  )
{
    return ...;
}

Затем можно использовать ParameterInfo.GetCustomAttributes , чтобы получить атрибуты параметров.

1 голос
/ 16 июня 2010

Было бы здорово, если бы вы могли передавать делегатов в качестве параметров атрибутам. Возможности безграничны. К сожалению, в настоящее время это невозможно, но на радаре .

0 голосов
/ 16 июня 2010

Нет, это невозможно.Список допустимых значений описан в разделе 17.2 спецификации языка C #.Он ограничен

  • Постоянными значениями
  • Объект System.Type
  • Одномерный массив любого из указанных выше

Лямбда-выражения не соответствуют ни одной из этих категорий

0 голосов
/ 16 июня 2010

Насколько мне известно, параметры атрибута ограничены типом bool, byte, char, double, float, int, long, short, string, object, System.Type и типом enum с общедоступной доступностью и одномерным массивом вышеуказанных типов. .

Ссылка MSDN

0 голосов
/ 16 июня 2010

Зачем изобретать велосипед (хотя бы для документирования)?

Microsoft имеет стандартную структуру документации XML-документацию , которую можно скомпилировать в .chm файлы документации.

Использование тройной записи /// для документирования ваших методов:

   /// <summary>MyMethod is a method in the MyClass class.
   /// <para>Here's how you could make a second paragraph in a description. <see cref="System.Console.WriteLine"/> for information about output statements.</para>
   /// <seealso cref="MyClass.Main"/>
   /// </summary>
   public static void MyMethod(int Int1)
   {
   }`

затем вы можете использовать <param name='Int1'>This is an int.</param> xml для определения любых значений параметров.

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

Чтобы сгенерировать файлы XML:

  1. Открыть страницы свойств проекта диалоговое окно.
  2. Щелкните папку «Свойства конфигурации».
  3. Перейдите на страницу свойств сборки.
  4. Изменить файл документации XML свойство.

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

В сочетании с Sandcastle документация XML является отличным инструментом для документирования кода и сборок.

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