dll で使用されるすべての構造体宣言変数をフィルター処理することは可能ですか?
静的フィールドの場合、次のコードを使用しています。
foreach (FieldInfo targetfield in InputType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static))
{
}
そのようにする方法はありますか?
おそらく、次のタイプのみが必要です。
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つあります。これには、DateTimeやTimeSpanなどの組み込みであるがプリミティブではない値型が含まれます...これらは構造体であるためです。何をしようとしているかに応じて、それで問題ないかどうかを判断する必要があります。(私の場合、私はそれらを望んでいませんでした。)結果にこれらを望まないと判断した場合、いくつかの可能性があります。
type != typeof(DateTime)
)。type.Assembly != typeof(object).Assembly
)からすべてを除外します。メンバー変数、別名フィールドまたはローカル変数を意味しますか?後者の場合、逆コンパイラの出力をウォークする必要があります... Cecilのように:http://mono-project.com/Cecil