"NotSupported"属性?

nat*_*ere 4 .net c# attributes

是否Attribute在.Net Framework中建议将代码标记为"不支持"?

到目前为止,我一直在使用,ObsoleteAttribute但它并不总是完全准确.例如,目前我正在编写托管的FMOD包装器,我想清楚地标记仅适用于不支持的平台的属性,枚举值等.

假设我有类似枚举的东西来确定音频文件的格式.我想明确指出,对于.Net端口至少,某些值是不相关的.例如:

enum SoundFormat{
    Wav,
    Mp3,
    OggVorbis,

    [Obsolete("Xbox360 only")] Xma,
    [Obsolete("GameCube only")] GcadPcm,
    [Obsolete("PS2/PSP only")] Vag,
}
Run Code Online (Sandbox Code Playgroud)

虽然使用Obsolete作品和某种用途的目的相同,但它也具有误导性,因为它们在技术上不会因为不受支持而过时.这是最终没有什么影响的事情之一,但每当我把Obsolete它放在不准确的地方时,它总会让我烦恼.

PS:在它建议之前,NotImplementedException并且NotSupportedException真的不回答这个问题,因为它们只提供运行时指导.我对编译时更感兴趣.

Ser*_*kiy 6

我建议你使用编译器指令来创建不同版本的程序集:

enum SoundFormat
{
    Wav,
    Mp3,
    OggVorbis,
 #if Xbox360        
    Xma,
 #elif GameCube        
    GcadPcm,
 #elif PS
    Vag,
 #endif
}
Run Code Online (Sandbox Code Playgroud)

如果你只在定义了Xbox360的情况下编译程序集,那么枚举将如下所示:

enum SoundFormat
{
    Wav,
    Mp3,
    OggVorbis,     
    Xma,
}
Run Code Online (Sandbox Code Playgroud)

更新:从您的原始问题中不清楚您要实现的目标.但是如果你想要所有这些枚举成员存在,并且如果使用特定于平台的格式就有编译器警告,那么你可以使用Pablo Fernandez建议的方法:

[Obsolete("Not supported")]
public class NotSupportedAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

然后使用NotSupported属性(更好地描述intent Obsolete)来装饰特定于平台的格式:

enum SoundFormat
{
    Wav,
    Mp3,
    OggVorbis,
    [NotSupported]     
    Xma,
    [NotSupported]
    GcadPcm,
    [NotSupported]
    Vag
}
Run Code Online (Sandbox Code Playgroud)

编译器仍将生成"过时"警告,但具有特定消息:

警告1'Foo.Bar.NotSupportedAttribute'已过时:'不支持'