【问题标题】:Use Lambda in Attribute constructor to get method's parameters在 Attribute 构造函数中使用 Lambda 获取方法的参数
【发布时间】:2021-03-27 15:10:05
【问题描述】:

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

我正在尝试创建一个 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 个方法,我认为编写一些东西来做到这一点比为每个服务编写文档页面更容易。一旦我将它放在我认为可以发布的地方,我将计划最终将它作为一个开源项目发布。

【问题讨论】:

    标签: c# attributes lambda


    【解决方案1】:

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

    public ActionResult Index(
        [Documentation("the identifier...")]
        int id,
    
        [Documentation("The filter")]
        string filter
      )
    {
        return ...;
    }
    

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

    【讨论】:

    • 谢谢,我忘了你可以将属性应用到参数本身。
    【解决方案2】:

    如果您可以将委托作为参数传递给属性,那就太好了。可能性是无止境。不幸的是,目前还不可能,但它在 radar 上。

    【讨论】:

    • 当/如果他们实施时,那将是很棒的......感谢链接:)
    【解决方案3】:

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

    MSDN Reference

    【讨论】:

      【解决方案4】:

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

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

      Lambda 表达式不属于这些类别中的任何一个

      【讨论】:

        【解决方案5】:

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

        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)
           {
           }`
        

        然后您可以使用&lt;param name='Int1'&gt;This is an int.&lt;/param&gt; xml 来定义任何参数值。

        一旦你记录了你的类和方法,你可以使用Sandcastle将它编译成html帮助文件。

        要生成 XML 文件:

        1. 打开项目的属性页 对话框。
        2. 单击配置属性文件夹。
        3. 单击“构建”属性页。
        4. 修改 XML 文档文件 财产。

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

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

        【讨论】:

        • 这不是一个普通的文档,它允许创建表单来传递值来测试方法。同时它更像是一个文档/测试表格。这样,如果您有第三方开发人员使用您的服务,这将允许他们在实施之前查看他们应该从服务接收的内容。
        • 啊。很公平。我不知道双重要求。不过问题很好:)
        猜你喜欢
        • 1970-01-01
        • 2016-03-11
        • 2021-01-08
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 2014-03-11
        • 2018-11-25
        • 1970-01-01
        相关资源
        最近更新 更多