Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在方法的特定参数上放置属性有什么用处?_C#_.net_Reflection_Custom Attributes - Fatal编程技术网

C# 在方法的特定参数上放置属性有什么用处?

C# 在方法的特定参数上放置属性有什么用处?,c#,.net,reflection,custom-attributes,C#,.net,Reflection,Custom Attributes,我正在寻找将属性放入参数的合理用例列表 我能想到一些方法中属性的好例子,但似乎看不到参数属性的好用法。请你开导我 那么方法返回类型上的属性呢?使用反射时,您可能需要一些与属性关联的元数据,例如,如果您要根据类中的属性执行一些代码生成 我想说的是,这个问题有点开放性,迟早会有一个需要出现,您会感谢语言支持它。例如,在.NET MVC框架中,控制器动作方法的参数可以“映射”到具有不同名称的参数。这就是Vici MVC的实现方式: public void ActionMethod([Parameter

我正在寻找将属性放入参数的合理用例列表

我能想到一些方法中属性的好例子,但似乎看不到参数属性的好用法。请你开导我


那么方法返回类型上的属性呢?

使用反射时,您可能需要一些与属性关联的元数据,例如,如果您要根据类中的属性执行一些代码生成

我想说的是,这个问题有点开放性,迟早会有一个需要出现,您会感谢语言支持它。

例如,在.NET MVC框架中,控制器动作方法的参数可以“映射”到具有不同名称的参数。这就是Vici MVC的实现方式:

public void ActionMethod([Parameter("user")] int userId)
{

}
这将把参数“user”从查询字符串映射到参数userId


这只是一个关于如何使用属性作为参数的简单示例。

在PInvoke中使用属性的一个具体案例。PInvoke签名中的参数可以通过使用属性选择性地用附加信息修饰,以便可以显式指定各个参数的PInvoke编组,或者覆盖默认编组行为,例如:

[DllImport("yay.dll")]
public static extern int Bling([MarshalAs(UnmanagedType.LPStr)] string woo);   

这将覆盖字符串参数“woo”的默认编组行为。

在Boo中,您可以添加宏属性。例如:

def Foo([required]p):
    pass
这告诉编译器将Foo方法转换为:

def Foo(p):
    raise ArgumentNullException("p") if p is null

与静态示例略有不同,但仍然很有趣。

正如其他人所示,一件事的好处可以通过其他人对它的处理来回答。例如,在MEF中,可以在构造函数的参数上使用它来指定要导入具有特定名称的依赖项:

public class Foo {
  [ImportingConstructor]
  public Foo([Import("main")] Bar bar) {
    ...
  }
}

事实上,这个问题可以被认为是主观的,因为没有“正确”的答案。然而,有一些答案比其他答案更好。代码契约是否广泛使用了这一点?