【发布时间】:2010-09-22 14:15:09
【问题描述】:
这会导致编译时异常:
public sealed class ValidatesAttribute<T> : Attribute
{
}
[Validates<string>]
public static class StringValidation
{
}
我意识到 C# 不支持通用属性。但是,经过多次谷歌搜索,我似乎找不到原因。
有谁知道为什么泛型类型不能从Attribute 派生?有什么理论吗?
【问题讨论】:
-
你可以做 [Validates(typeof(string)] - 我同意泛型会更好......
-
尽管这是对这个问题的一个非常晚的补充,但令人遗憾的是,不仅属性本身而且抽象属性类(显然不能被实例化为属性)都不允许,如下所示:
abstract class Base<T>: Attribute {}可用于创建非泛型派生类,如下所示:class Concrete: Base<MyType> {} -
我渴望通用属性和接受 lambda 的属性。想象一下
[DependsOnProperty<Foo>(f => f.Bar)]或[ForeignKey<Foo>(f => f.IdBar)]... -
这在我刚刚遇到的情况下非常有用;最好创建一个接受泛型类型的 LinkedValueAttribute 并在指定的实际值上强制执行该类型。我可以将它用于枚举来指定另一个枚举的“默认”值,如果选择了这个枚举值,则应该使用该值。可以为不同的类型指定多个这些属性,我可以根据我需要的类型得到我需要的值。我可以将其设置为使用类型和对象,但强类型化将是一个巨大的优势。
-
如果你不介意一点 IL,this looks promising。
标签: c# generics .net-attributes