获取dll中使用的结构

时间:2012-12-06 11:41:49

标签: c# .net struct

是否可以过滤所有在dll中使用的声明变量的结构?

对于静态字段,我使用以下代码:

foreach (FieldInfo targetfield in InputType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static))
{
}

有没有可能的方法呢?

2 个答案:

答案 0 :(得分:3)

您可能只需要以下类型:

  • 值类型(所有结构都是值类型):请参阅IsValueType属性。
  • 不是枚举(枚举是值类型,但您可能不希望将它们视为结构):请参阅IsEnum属性。
  • 不是原始类型(例如Int32,这是一种值类型,但同样可能不是您想要考虑的“结构”):请参阅IsPrimitive属性。

这样的事情:

const BindingFlags bindingFlags =
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
var structFields = from field in InputType.GetFields(bindingFlags)
                   let type = field.FieldType
                   where type.IsValueType
                       && !type.IsEnum
                       && !type.IsPrimitive
                   select field;
foreach (var targetField in structFields) { ... }

可能出乎意料的一件事:这将包括内置但非原始的值类型,如DateTimeTimeSpan ......因为它们结构。你必须决定是否可以,这取决于你想要做什么。 (在我的情况下,我不想要它们。)如果你决定在结果中不想要这些,那么可能有以下几种可能性:

  • 明确过滤掉它们(type != typeof(DateTime))。
  • 过滤掉mscorlib程序集中的所有内容(type.Assembly != typeof(object).Assembly)。

答案 1 :(得分:0)

你的意思是成员变量又是字段还是局部变量?在后一种情况下,你应该走一个反编译器的输出......就像塞西尔:http://mono-project.com/Cecil