我首先要说的是,我假设静态数组初始化程序由编译器转换为私有嵌套类,通常使用__StaticArrayInitTypeSize=12
之类的名称。据我了解,阅读this extremely informative article后,这些私有类是值类型,并且没有使用CompilerGeneratedAttribute
类标记。
我正在开发一个需要处理某些类型并忽略其他类型的项目。
我必须能够处理自定义结构类型,与生成的静态数组初始化程序类一样,它们是值类型。我必须忽略生成的静态数组初始化类。我也必须忽略枚举和委托。
我正在用Linq拉这些课程,如下:
var typesToProcess = allTypes.Where(type => !type.IsEnum &&
!type.IsArray &&
!type.IsSubclassOf(typeof(Delegate)));
我很确定IsArray
属性不是我认为的那样。无论如何,生成的静态数组初始化器类仍显示在typesToProcess
Enumerable。
还有其他人处理过此事吗?如何识别自定义结构和生成的静态数组初始化程序类之间的区别?我可以通过对__StaticArrayInitTypeSize
进行类型名称的字符串比较来破解它,但是有更清洁的解决方案吗?
答案 0 :(得分:1)
好吧,我刚刚使用C#4编译器尝试过,我得到了一个名为<PrivateImplementationDetails>{D1E23401-19BC-4B4E-8CC5-2C6DDEE7B97C}
的内部类,其中包含一个名为{{1的私有嵌套 struct }}
该类包含一个名为__StaticArrayInitTypeSize=12
的结构类型的内部静态字段。该字段本身用$$method0x6000001-1
装饰。
问题是所有都是特定于实现的。它可能会在将来的版本中发生变化,也可能与早期版本不同。
包含CompilerGeneratedAttribute
,<
或>
的任何成员名称都是“无法形容”的名称,将由编译器生成,因此您可以查看那是一种隐含的=
,如果有任何用处的话。 (但是,对于此类生成的类型,还有许多其他用途。)