方法参数的属性

时间:2014-05-28 14:39:10

标签: c# methods attributes arguments

查看ASP.NET Web Api,您可以向方法参数添加[FromBody][FromUri]等属性,例如:

public virtual Foo Get([FromUri] Guid id)
public virtual HttpResponseMessage Post([FromBody] Foo foo)

我也知道它们在CallerInformation中使用。

我理解他们在这种情况下正在做什么,但我有兴趣了解导致其使用的设计选择。

还有,

方法参数上使用的属性的更多示例。

1 个答案:

答案 0 :(得分:2)

当ASP.NET调用这些方法时,需要确定哪个值到哪个参数。对于每个参数,它使用反射来检查这些属性,这些属性指定参数值的来源,为您提供控制。这就是他们如何做到这一点:

Type myType = typeof(MyType)
MethodInfo method = myType.GetMethod('Post');
foreach (ParameterInfo parameter in method.GetParameters())
{
    if (parameter.IsDefined(typeof(FromUri), false))
    {
        // attempt to find value in uri
    }        
    else if (parameter.IsDefined(typeof(FromPost), false))
    {
        // from post body
    }
    else
    {
        // have to find out myself!
    }
}

我认为任何替代方案都不如此简单灵活 - 您当然可以使用单独的配置文件或实现描述参数值来源的界面 - 我认为它很不错把它全部定义在那个方法上。

此外,通过将请求主体作为参数传递给方法,您可以在没有Web环境的情况下对方法进行单元测试。