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

本文关键字:自定义属性 成员 如果 | 更新日期: 2023-09-27 18:32:38

考虑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 教程,用谷歌搜索了我能想到的每个相关术语,查看了 StructLayout 和 FieldOffset 的文档,甚至使用"转到定义..."检查了这两个属性的元数据。在 VS 代码编辑器中。我一直无法找到有关如何强制执行这两个属性之间关系的任何线索。

如果我想做类似的事情:

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

我该怎么做?

编辑:问题强制使用自定义属性,建议作为重复项,询问如何强制从基类继承的类包含属性,而不是如何强制修饰类的成员包含某个属性。此外,提供的答案是"它不可能完成",而在这种情况下,显然是由 .net 库的作者完成的。问题只是如何。

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

某些属性包含编译器的信息。因此,自然而然地,编译器中有显式代码来解释它,如果失败,还会有错误消息。

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

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