0

私は、相互に関連するすべてのクラスを抽出するソリューションに取り組んでいます。オブジェクトブラウザでクラスをクリックすると、オプションが表示されますFind All References。あるクラスと他のクラスとの関連付けを見つけるようなものが必要です。どうすればそれらを使用して見つけることができますReflectionか?

抽出に興味があります

  1. 構成関係:
  2. 集約関係
  3. 協会関係
  4. 継承
4

2 に答える 2

1

生成されたILコードを解析する必要があります。できれば、それらがどのように機能するかを理解してください。MethodBase.GetMethodBodyに続いてMethodBody.GetILAsByteArrayを呼び出すことにより、ILコードを取得できます。

OpCodes列挙型に従ってすべてのバイトを解析する必要があります。また、オフセットやトークンなどのすべてのオペコードデータを処理する必要があります。これは、それらを実際のオペコードとして解析するべきではないためです。OpCodes.Ldstrオペコードを例にとってみましょう。0x72とそれに続くトークンで構成されます。このトークンは、Int32として解析する必要がある4バイトであり、 Module.ResolveStringを使用して解決できます(ldstrに文字列トークンがあることがわかっているため)。Moduleインスタンスは、Assembly.AssemblyManifestModuleから取得できます。

于 2012-04-30T15:49:06.157 に答える
1

Reflectionクラスのすべてのプロパティ、フィールド、メソッド (およびその他) を一覧表示するために使用できます。これらを調べて、その型とパラメーター リストを決定する必要があります。おそらく、System名前空間から型を破棄することをお勧めします。

Type t = typeof(MyClass);

// Determine from which type a class inherits
Type baseType = t.BaseType;

// Determine which interfaces a class implements
Type[] interfaces = t.GetInterfaces();

// Get fields, properties and methods
const BindingFlags bindingFlags =
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
FieldInfo[] fields = t.GetFields(bindingFlags);
PropertyInfo[] properties = t.GetProperties(bindingFlags);
MethodInfo[] methods = t.GetMethods(bindingFlags);

foreach (var method in methods) {
    // Get method parameters
    ParameterInfo[] parameters = method.GetParameters();
}

FieldInfoIntellisense は、 、PropertyInfoMethodInfoおよびの (ほぼ) すべての秘密を教えてくれますParameterInfo。クラス、イベントなどの汎用パラメーターを調べることも検討してください。

于 2012-04-30T15:37:13.293 に答える