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) { ... }

予期しないことが1つあります。これには、DateTimeTimeSpanなどの組み込みであるがプリミティブではない値型が含まれます...これら構造体であるためです。何をしようとしているかに応じて、それで問題ないかどうかを判断する必要があります。(私の場合、私はそれらを望んでいませんでした。)結果にこれらを望まないと判断した場合、いくつかの可能性があります。

  • それらを明示的に除外します(type != typeof(DateTime))。
  • mscorlibアセンブリ(type.Assembly != typeof(object).Assembly)からすべてを除外します。
于 2012-12-06T11:59:28.753 に答える
0

メンバー変数、別名フィールドまたはローカル変数を意味しますか?後者の場合、逆コンパイラの出力をウォークする必要があります... Cecilのように:http://mono-project.com/Cecil

于 2012-12-06T11:56:03.747 に答える