2010-06-16 69 views
1

我甚至不确定这是否可能,但我已经用尽了所有想法来解决这个问题,所以我想我会把它发送给社区并看看你的想法。而且,如果不可能的话,也许你也会有一些想法。在属性构造函数中使用Lambda来获取方法的参数

我试图让一个属性类,我可以添加到,让我用一个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

我不相信这是可能的,但我不认为你需要反正。相反,你可以直接把属性的参数,就像这样:

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

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

然后可以使用ParameterInfo.GetCustomAttributes得到的参数属性。

+0

谢谢,我忘了你可以应用属性的参数本身。 – 2010-06-16 01:45:36

1

如果您可以将代表作为参数传递给属性,那将会很棒。可能性是无止境。不幸的是,它目前不可能,但它在radar

+0

这将是真棒时/如果他们实现..感谢您的链接:) – 2010-06-16 01:46:13

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. 单击Build属性页面。
  4. 修改XML文档文件 属性。

为了帮助您,我推荐一款名为GhostDoc的工具,该工具为方法提供上下文菜单文档生成。它没有提供完美的文档,但它提供了一个很好的通用结构。

与Sandcastle相结合,XML文档是记录代码和程序集的好工具。

+1

这不会是一个正常的文档,它将允许创建表单来传递值来测试方法。它更多的是一个文档/测试表单,在同一时间。这样,如果您有第三方开发人员利用您的服务,这将使他们能够在实施服务之前看到他们应该从服务中获得什么。 – 2010-06-16 01:44:49

+0

啊。很公平。我没有意识到双重要求。好问题,虽然:) – 2010-06-16 03:29:08

0

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

MSDN Reference

0

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

  • 常数值
  • 甲System.Type对象
  • 的任一维阵列上述

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

相关问题