如何辨别Type是否是静态数组初始值设定项?

时间:2011-10-14 21:49:23

标签: linq reflection c#-3.0

我首先要说的是,我假设静态数组初始化程序由编译器转换为私有嵌套类,通常使用__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进行类型名称的字符串比较来破解它,但是有更清洁的解决方案吗?

1 个答案:

答案 0 :(得分:1)

好吧,我刚刚使用C#4编译器尝试过,我得到了一个名为<PrivateImplementationDetails>{D1E23401-19BC-4B4E-8CC5-2C6DDEE7B97C}的内部,其中包含一个名为{{1的私有嵌套 struct }}

该类包含一个名为__StaticArrayInitTypeSize=12的结构类型的内部静态字段。该字段本身用$$method0x6000001-1装饰。

问题是所有都是特定于实现的。它可能会在将来的版本中发生变化,也可能与早期版本不同。

包含CompilerGeneratedAttribute<>的任何成员名称都是“无法形容”的名称,由编译器生成,因此您可以查看那是一种隐含的=,如果有任何用处的话。 (但是,对于此类生成的类型,还有许多其他用途。)