我有一个通用类,需要在类属性中使用其类型参数之一的名称。我不知道如何在这种情况下访问类名
我尝试使用typeof(TMsg).Name
,但VS显示错误提示
属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式
当前我的代码如下:
[MessageBase(typeof(TMsg).Name)]
public abstract class DDSMessageAbstract<TMsg/*, TReader, TWriter, TMsgBase, TSupport*/> : MessageBaseForDDS
where TMsg : new()
...
我的问题是,我是否可以使用TMsg
的实际名称,还是必须为每个继承的类定义此属性?
答案 0 :(得分:3)
简短的答案可能是您无法做到这一点。
首先,泛型用于您的类而不是属性。所以你不能使用
MessageBase(typeof(TMsg)
attributes
中的值仅限于简单类型;例如基本常数(包括字符串)和typeof
。
从ECMA 334v4:
§24.1.3属性参数类型
位置和命名的类型 属性类的参数是 限于 attribute参数 类型,即:
- 以下类型之一:
bool
,byte
,char
,double
,float
,int
,long
,short
,string
。- 类型
object
。- 类型
System.Type
。- 枚举类型,只要它具有公共可访问性并且 嵌套的类型(如果有) 也具有公共可访问性。
- 上述的一维数组 类型。