在Attribute构造函数中使用Lambda来获取方法的参数

时间:2010-06-16 01:23:24

标签: c# attributes lambda

我甚至不确定这是否可行,但我已经用尽所有想法来解决这个问题,所以我想我会把它发送给社区并看看你的想法。而且,如果不可能,也许你也有一些想法。

我正在尝试创建一个Attribute类,我可以将其添加到一个允许我使用lambda表达式获取方法的每个参数的方法


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 个答案:

答案 0 :(得分:5)

我不相信这是可能的,但我认为你无论如何都不需要。相反,您可以将属性直接放在参数上,如下所示:

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

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

然后,您可以使用ParameterInfo.GetCustomAttributes获取参数的属性。

答案 1 :(得分:1)

如果您可以将委托作为参数传递给属性,那就太棒了。可能性是无止境。不幸的是,它目前无法实现,但它位于radar

答案 2 :(得分:0)

为什么重新发明轮子(至少记录)?

Microsoft有一个标准的文档结构XML documentation,可以编译成.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文档文件 属性。
  5. 为了帮助您,我推荐一个名为GhostDoc的工具,它为方法提供上下文菜单文档生成。它没有提供完美的文档,但它提供了良好的通用结构。

    与Sandcastle结合使用,XML文档是记录代码和程序集的绝佳工具。

答案 3 :(得分:0)

据我所知,属性参数仅限于bool,byte,char,double,float,int,long,short,string,object,System.Type和enum类型,具有公共可访问性和上述类型的单维数组

MSDN Reference

答案 4 :(得分:0)

不,这是不可能的。允许值列表在C#语言规范的第17.2节中介绍。它仅限于

  • 常数值
  • System.Type对象
  • 以上任一
  • 的一维数组

Lambda表达式不适合任何这些类别