5

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

我可以想到方法中属性的一些好案例,但似乎看不到参数属性的良好用法。请赐教。

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

4

5 回答 5

7

使用它们的一个特定情况是在 PInvoke 中。PInvoke 签名中的参数可以通过使用属性选择性地使用附加信息进行修饰,以便可以显式指定 PInvoke 编组单个参数或覆盖默认编组行为,例如:

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

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

于 2010-06-17T20:29:26.737 回答
3

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

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

}

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

这只是一个简单的示例,说明如何将属性用于参数。

于 2010-06-17T20:23:14.137 回答
1

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

我想说这个问题有点开放式,迟早会有需求出现,你会感谢语言支持它。

于 2010-06-17T20:20:12.710 回答
1

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

def Foo([required]p):
    pass

这告诉编译器将 Foo 方法转换为:

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

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

于 2010-06-17T20:35:13.187 回答
0

正如其他人所表明的,一件东西有什么好处可以通过其他人用它做什么来回答。Egin MEF 您可以在构造函数的参数上使用它来指定要导入具有特定名称的依赖项:

public class Foo {
  [ImportingConstructor]
  public Foo([Import("main")] Bar bar) {
    ...
  }
}
于 2010-06-17T20:39:44.177 回答