考虑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库的作者完成了。问题只是如何。
答案 0 :(得分:2)
某些属性包含编译器的信息。很自然地,编译器中有明确的代码来解释它,如果失败则会出现错误消息。
在我们的项目中,我们有单元测试,它们加载所有类型的程序集并检查一些属性的一致性。
在这种情况下,您还可以尽早让应用程序抛出异常(例如,在启动时)。如果您的应用程序检测到此类错误,这是一个简单的解决方案。重要的是尽早投入,否则你会错过它直到它上线...