我正在编写自定义属性而不是标记接口(interface)
public class FooAssignableAttribute : Attribute
{
...
}
[FooAssignable]
public class Foo
{
...
}
我不能像这样编写字典吗?
Dictionary<string, FooAssignable> dictionary;
避免标记界面,我正在尝试使用自定义属性。为什么我不能写上面的代码?
最佳答案
不,这行不通。 C# 中泛型集合(或其他泛型)的参数类型必须是可声明类型,属性仅作为元数据存在。
您不能拥有 FooAssignable 类型的对象。您可以拥有一个具有 FooAssignable 属性的对象,但这与将其作为父类(super class)型不同。 FooAssignable 不是类或接口(interface),也不是有效的类型说明符。 FooAssignableAttribute 是,但这是引用属性本身的类型,而不是用该属性标记的项目。
考虑在字典中,索引器的输出类型是您提供的输出类型。但是你不能有一个类型为 FooAssignable 的变量——你可以有一个类型的变量被标记为 FooAssignable,但是没有一个基类适合所有这些类型。由于该类型声明是非法的,因此此 Dictionary 将有一个非法的、不存在的类型作为其索引器的 getter 的返回类型,以及许多其他地方。 C# 类型检查不能通过具有属性存在检查的通用机制自发替换。
任何你希望类型系统为你检查的东西都必须是类型系统的一部分。属性评估不定义类型,所以类型系统不能为你做这件事;同时,泛型是语言中与类型系统最直接交互的部分。您实际上必须通过类型系统来执行这样的检查,这确实意味着将 FooAssignableAttribute 提升为接口(interface)(IFooAssignable?)。
关于c# - 如何命名使用属性的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9041205/