1

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

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

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

有什么可能的方法吗?

4

2 回答 2

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) 中过滤掉所有内容。
于 2012-12-06T11:59:28.753 回答
0

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

于 2012-12-06T11:56:03.747 回答