我正在编写自定义属性而不是标记接口
public class FooAssignableAttribute : Attribute
{
...
}
[FooAssignable]
public class Foo
{
...
}
我不能像这样编写字典吗?
Dictionary<string, FooAssignable> dictionary;
避免标记接口,我正在尝试使用自定义属性。为什么我不能写上面的代码?
我正在编写自定义属性而不是标记接口
public class FooAssignableAttribute : Attribute
{
...
}
[FooAssignable]
public class Foo
{
...
}
我不能像这样编写字典吗?
Dictionary<string, FooAssignable> dictionary;
避免标记接口,我正在尝试使用自定义属性。为什么我不能写上面的代码?
不,这行不通。C# 中泛型集合(或其他泛型)的参数类型必须是可声明类型,并且属性仅作为元数据存在。
您不能拥有 FooAssignable 类型的对象。您可以拥有一个具有 FooAssignable 属性的对象,但这与将其作为超类型不同。FooAssignable 不是类或接口,也不是有效的类型说明符。FooAssignableAttribute 是,但这是指属性本身的类型,而不是用该属性标记的项目。
考虑在字典中,索引器的输出类型是您提供的输出类型。但是你不能有一个 FooAssignable 类型的变量——你可以有一个已经用 FooAssignable 标记的类型的变量,但是没有一个基类适合所有这些类型。由于该类型声明是非法的,因此此 Dictionary 将有一个非法的、不存在的类型作为其索引器的 getter 的返回类型,以及许多其他地方。AC# 类型检查不能通过具有属性存在检查的通用机制自发替换。
您希望类型系统为您检查的任何内容都必须是类型系统的一部分。属性评估不定义类型,所以类型系统不能为你做这件事;同时,泛型是语言中与类型系统最直接交互的部分。您实际上必须通过类型系统来执行这样的检查,这确实意味着将 FooAssignableAttribute 提升为接口(IFooAssignable?)。
FooAssignableAttribute
是类的名称。如果你想在代码中引用这个类,你必须使用它的名字。
省略尾随“ Attribute
”的简写仅在您将其用作属性时才有效,[FooAssignable]
例如上面的示例。当您将它用作类时——例如,作为变量声明或泛型类型参数——您必须使用它的类名。
只需更改您的班级名称(如果可能):
public class FooAssignable : Attribute
{ ... }
与您自己的风格指南保持一致或选择任何现有的风格指南。