如果类本身具有自定义属性,如何在所有类成员上使用自定义属性?

时间:2016-02-01 04:39:34

标签: c# .net

考虑StructLayout(LayoutKind.Explicit)

的情况
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
public struct UnionThingy
{
    [FieldOffset(0x00)]
    public short word;

    [FieldOffset(0x00)]
    public byte hiByte;

    [FieldOffset(0x01)]
    public byte lowByte;

    public bool additionalField;     // compile error!
}

尝试编译上述代码会导致错误CS0625

  

'UnionThingy.additionalField':标记为StructLayout(LayoutKind.Explicit)的实例字段类型必须具有FieldOffset属性。

这似乎是一个非常有用的功能,我很好奇它是如何实现的。

我已经阅读了关于自定义属性的MSDN教程,用Google搜索了我能想到的每个相关术语,查看了StructLayout和FieldOffset的文档,甚至用“转到定义...”检查了这两个属性的元数据。 “在VS代码编辑器中。我一直无法找到关于如何强制执行这两个属性之间关系的任何线索。

如果我想做类似的事情:

[OptionalCustomAttribute]
public class DecoratedClass
{
    [DetailsRequiredByOptionalCustomAttribute(2)]    // compiler error if ommitted
    public int SomeProperty {get; set;}
}

我该怎么做呢?

编辑:提出重复的问题Force usage of custom attribute询问如何强制从基类继承的类包含属性,而不是如何强制执行成员< / em>装饰类包含某个属性。此外,提供的答案是“它无法完成”,而在这种情况下显然已经由.net库的作者完成了。问题只是如何。

1 个答案:

答案 0 :(得分:2)

某些属性包含编译​​器的信息。很自然地,编译器中有明确的代码来解释它,如果失败则会出现错误消息。

在我们的项目中,我们有单元测试,它们加载所有类型的程序集并检查一些属性的一致性。

在这种情况下,您还可以尽早让应用程序抛出异常(例如,在启动时)。如果您的应用程序检测到此类错误,这是一个简单的解决方案。重要的是尽早投入,否则你会错过它直到它上线...