在类属性中使用通用类型的名称

时间:2019-06-12 14:20:09

标签: c# generics

我有一个通用类,需要在类属性中使用其类型参数之一的名称。我不知道如何在这种情况下访问类名

我尝试使用typeof(TMsg).Name,但VS显示错误提示

  

属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

当前我的代码如下:

[MessageBase(typeof(TMsg).Name)]
    public abstract class DDSMessageAbstract<TMsg/*, TReader, TWriter, TMsgBase, TSupport*/> : MessageBaseForDDS
    where TMsg : new()
...

我的问题是,我是否可以使用TMsg的实际名称,还是必须为每个继承的类定义此属性?

1 个答案:

答案 0 :(得分:3)

简短的答案可能是您无法做到这一点。

首先,泛型用于您的类而不是属性。所以你不能使用

MessageBase(typeof(TMsg)

attributes中的值仅限于简单类型;例如基本常数(包括字符串)和typeof

从ECMA 334v4:

  

§24.1.3属性参数类型

     

位置和命名的类型   属性类的参数是   限于 attribute参数   类型,即:

     
      
  • 以下类型之一:boolbytechar,   doublefloatintlongshortstring
  •   
  • 类型object
  •   
  • 类型System.Type
  •   
  • 枚举类型,只要它具有公共可访问性并且   嵌套的类型(如果有)   也具有公共可访问性。
  •   
  • 上述的一维数组   类型。
  •   

ECMA-334

相关问题