2012-02-09 19 views
2

を見つけるために、.NETリフレクションを使用して、私は、アセンブリ内で定義された共通の先祖クラスを(持っているタイプを含むアセンブリを持っている。共通の祖先は、ほとんどの場合、ないクラスの直接の基本型である。共通の先祖クラス

私は、このアセンブリのすべての型から、この共通の祖先を持つものを除外できるようにする必要があります。さまざまな理由で、型をインスタンス化できません(一般的なコンストラクタ署名はありません) myAssembly.GetTypes()で始まり、型自体のプロパティを調べてください。言い換えれば、クラスのインスタンスではなくクラスで作業する必要があります。

このコレクションの各タイプを調べて、共通の祖先から継承しているかどうかを調べるにはどうすればよいですか?

後で、心配する必要はありません。

Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(typeof(AncestorClass))); 

を祖先型が定義されて、私が思うに、ので:トリックは、しかし、これは動作しません例えば

Type ancestor = assy.getType("myAncestorClassName", true, true); 
Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(ancestor)); 

、アセンブリから祖先型のあるタイプのオブジェクトをインスタンス化することです他のアセンブリではなく、主アセンブリ内にある。

多くの場合、後で....これに答えてくれた皆様に感謝します。私は道に沿って何かに転用されましたが、私は今、きちんとした解決策を持っています(新しいことを学びました)。

+0

あなたはタイプのツリーを直接タイプします。それ自体はタイプです。タイプはもう一度です...ルートには1つのノードしかありません - それはすべてのものから全てのオブジェクトが継承されます... – Yahia

答えて

4

コレクション内の各タイプについて、Type.IsAssignableFromを使用してこの祖先から派生しているかどうかを確認できます。例えば

var types = assembly.GetTypes().Exclude(t => typeof(CommonAncestor).IsAssignableFrom(t)); 

これはCommonAncestorから派生されていないアセンブリ内のすべての型を取得する必要があります。

+0

ありがとう - 私が見落とした問題は、問題のタイプがロードされたアセンブリから「抽出」されなければならないということです。私は参照されたアセンブリから直接それを参照していたが、それは動作しません。 – haughtonomous

+0

'typeof(AncestorClass)'は、それがロードされたアセンブリのタイプになります。正しいアセンブリから 'AncestorClass'の正しい定義を使用していますか? – Lukazoid

2

Type.IsAssignableFromを使用して、あるタイプが別のタイプのインスタンスから割り当て可能かどうかを調べます。あなたがC#

Type[] types = myAssenbly.GetTypes(); 

foreach(Type t in types) 
{ 
    // Is a Common Ancestor subclass 
    bool isString = t.IsAssignableFrom(typeof(CommonAncestor)); 
} 
1

はこのスニペットをチェックアウト:

var commonAncestor = typeof(object); 
var descendants = 
    Assembly.GetExecutingAssembly().GetTypes().Where(
    type => commonAncestor.IsAssignableFrom(type)); 

これはobjectの子孫である現在のアセンブリのすべての型を取得します。当然ながら、あなた自身の共通の祖先型に置き換えてください。エラーなし

MyType b = new MyType(); 
object a = b; 

:あなたのような何かを行うことができます

Type.IsAssignableFrom()方法かどうかをチェックします。

1

を使用していると仮定すると、

関連する問題