c# - 如何命名使用属性的类?

标签 c# class interface marker-interfaces

我正在编写自定义属性而不是标记接口(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/

相关文章:

c# - Winforms 添加和删除用户控件

c# - MySql.Data.MySqlClient 调用存储过程时出错

javascript - jQuery 将类的一部分与 hasClass 匹配

java - 我应该将公共(public)接口(interface)放在单独的文件中吗?

typescript - 是否可以为 typescript 中的接口(interface)函数提供默认参数?

c# - 无法让 Fiddler 捕获到 IIS 的本地流量

java - 签名 Java Applet 中的嵌套类

javascript - 从每个实例都有一个私有(private)闭包的模块导出一个类,但它的原型(prototype)链仍然可以扩展?

java 。如何重新定义 MediaPlayer 实例的 onCompletion 方法

c# - 我怎样才能杀死两个进程?