在泛型参数上有什么用途?

时间:2011-01-31 18:41:36

标签: c# .net generics attributes

将属性放在类或方法的泛型参数上是有效的(即它编译并运行):

public class MyClass<[My] T>
{
    private void MyMethod<[My] T>()
    {}
}

public class MyAttribute : Attribute
{}

我从来没有见过这种情况,而且我正在努力想出一个你想要的理由。

这只是语言规范的怪癖/副作用,还是将属性置于此位置是否有效/有用?

2 个答案:

答案 0 :(得分:13)

出于同样的原因,属性对任何构造都有用;他们提供的元数据可以被Reflection或其他后处理器用来做各种事情。例如,您可能有一个AOP系统使用类型参数上的属性来应用某些运行时约束,否则这些约束将无法表达。我不确定是否有任何系统实际上使用这些属性来做任何事情,但是没有理由不允许它们作为元数据。

答案 1 :(得分:1)

我确信一些AOP坚果会找到用属性装饰通用参数的正当理由。我当然想不出来。试试这个:

typeof(MyClass<>).GetGenericArguments().GetCustomAttributes().OfType<MyAttribute>();

如果此Enumerable具有任何元素,则可以访问您在类的泛型参数上放置的属性。如果没有,那么你就不能拥有你期望从你的代码库中的任何其他类访问的数据,这是毫无意义的。但是,它们仍然可以具有在实例化时运行的代码,并且当泛型类进入范围时它们由运行时实例化,允许您在属性本身中执行面向方面的逻辑。究竟是什么,以及如何与直接装饰通用类或方法有什么不同,留给那些崇拜AOP的人比我做的更多。