3

問題を解決するために少し説明する必要があります。

私には3つのプロジェクトがあります:

プロジェクト1はプロジェクト2と3を見ることができます。

プロジェクト2はプロジェクト3を見ることができます。

プロジェクト3はdllであり、その他はアプリです。

多くのサブクラスを持つクラスを設計する必要がありました。サブクラスはすべて、ベースで抽象として宣言されているメソッドを持っているため、すべてそれを使用する必要があります。methodeのコードはプロジェクトと直接対話するため、すべてのプロジェクトに分散させる必要があります。

抽象基本クラスはプロジェクト3にあり、サブクラスは2と1にあります。私が抱えている問題があります。

これは私が書いた方法です:

   public static IEnumerable<Type> GetSubClasses(Type typ)
   {
       IEnumerable<Type> subclasses =
       from type in Assembly.GetAssembly(typ).GetTypes()
       where type.IsSubclassOf(typ) && !type.IsAbstract
       select type;
       return subclasses;
   }

このタイプのすべてのサブクラスを取得しようとしていますが、取得すると、現在のプロジェクトからのみサブクラスを取得します。たとえば、project1からそれらを取得しようとすると、プロジェクト2からサブクラスを取得しません。

それ、どうやったら出来るの?プロジェクト2からアセンブリ参照を取得できることはわかっていますが、GetAssembly(Type t)メソッドがないため、すべてのサブクラスを取得できます。それが同じだとしたら、私はそこで同じことをしなければなりませんでした。

私の2番目の質問は、もっと簡単な方法はありますか?多くのプロジェクトでこれらのクラスを使用するのは少し「大規模」ですが、それらを1つにまとめるソリューションがあるかもしれません。私が言ったように、彼ら全員が持つ必要のあるメソッドのコードは、彼らがいるプロジェクトと直接対話する必要があります。

4

3 に答える 3

1

問題はあなたが呼んでいることですAssembly.GetTypes()。それはあなたにその特定のアセンブリのクラスだけを与えます。3つのアセンブリすべてのオブジェクトがある場合はAssembly、次のようなことができます。

assem1.GetTypes()
.Concat(assem2.GetTypes())
.Concat(assem3.GetTypes())

Assemblyしたがって、問題は3つのオブジェクトをどのように取得するかです。プロジェクト1からあなたはただ言うことができます

var assem1 = typeof(SomeClassInProj1).Assembly;
var assem2 = typeof(SomeClassInProj2).Assembly;
var assem3 = typeof(SomeClassInProj3).Assembly;

他のアセンブリを「見る」ことができないプロジェクトでは、それらをロードする必要があります。のドキュメントを参照してくださいAssembly.Load

于 2012-11-08T09:23:11.690 に答える
0

探したいタイプを含む可能性のあるすべてのアセンブリをロードし、ループで行うようにタイプを探す必要があります。

いくつかの基本クラスから継承する、現在のアプリケーションのbinフォルダー内のアセンブリからすべてのクラスのリストを取得するために次のようなことを行いました。

// load all files from current dir which ends with `.dll`
var q = from s in Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll")
        select s;

var types = q.Select(s => getTypes(s, myBaseType))
             .SelectMany(typeList => typeList).ToList();

そして関数getTypes:

IEnumerable<Type> getTypes(string filePath, Type baseType) {
    Assembly a = Assembly.LoadFrom(filePath);
    return a.GetTypes().Where(t => t.IsSubclassOf(baseType) && !t.IsAbstract);
}

BadImageFormatExceptionフォルダに.netアセンブリではないdllがある場合など、いくつかの例外に対処する必要があります。

別のアプローチは、検査するアセンブリのリストを構成することです。

于 2012-11-08T08:57:52.273 に答える
0

基本クラスまたはインターフェースは、その継承者または実装者を認識または気にする必要はありません。相互作用は、オーバーライドされる抽象メンバーまたは仮想メンバーに限定する必要があります。

同様に、パブリックタイプをエクスポートするアセンブリは、インポーターについて何も知るようには設計されていません。「EarlyBinding」を使用してこれを行うと、循環参照が作成されます。

アプリケーションドメインにロードされたすべてのアセンブリを反映して、特定のタイプから継承するアセンブリを確認することもできますが、この情報をどのように処理する予定ですか?それを達成するためのより簡単でより速い方法がおそらくあります。

于 2012-11-08T09:15:57.227 に答える