XYZ

2016-04-26 7 views
0

という名前のプロパティを持つアセンブリのすべての型、私は特定の名前のプロパティを宣言している特定のアセンブリのすべての型を取得したい取得します。これらのクラスは、同じ由来するものではないことをXYZ

public class Car 
{ 
    public WheelInfo WHEEL { get; set; } 
} 

public class Plane 
{ 
    public WheelInfo WHEEL { get; set; } 
} 

注意をWHEELを実装する基本クラスですが、実際には同じ名前の異なるプロパティです。

C#でリフレクションを使用してこれに適切なアプローチは何でしょうか?アセンブリには200以上のクラスがあり、検索されます。

Type t = typeof(MyAssembly).Assembly.GetType("MyAssembly.ABC"); 
var customProperty = t.GetProperty("XYZ"); //check if it is null 

しかし、単にすべてのすべてのタイプを取得し、各検索のためのより良い方法があるかどうか私は知らない。今のタイプはABCがXYZがこのように宣言されたプロパティを持っている場合、私は確認することができ

いずれかが入力スティングとして指定されているかどうかを確認してください。

+0

なぜこれをやりたいですか?例えば追加しないだろう。インターフェイスはあなたの実際の問題のより良い解決策ですか?しかし、いいえ、登録クラスや使用可能なすべてのタイプを定義するもの(あなたがしようとしているものに合っていないように見えるもの)を作成しない限り、すべてのタイプとフィラーをプロパティで列挙する以外の方法はありません。 – Luaan

答えて

1

すべての型を繰り返し処理し、探しているプロパティのそれぞれをチェックするよりも良い方法はありません。

あなたはこのようなものを使用できます。可能であれば、一致するインターフェイスを作成する方が良いだろう。もちろん、

foreach (Type t in typeof(MyAssembly).Assembly.GetTypes()) 
{ 
    PropertyInfo p = t.GetProperty("XYZ"); 

    if (p != null) 
    { ... } 
} 

をしていますが、アセンブリ内のコードを制御することはできません場合は、このあなたの唯一の解決策です。

+0

...ただし、名前がXYZのインデックス付きプロパティがないと判断した場合のみです。具体的には、アセンブリに影響がない場合は、除外できるものではない可能性があります。 – Georg

0

理論的には、それはさらに複雑です。問題は、CLRでは、異なるパラメータ(インデクサを除いてC#でサポートされていないインデックス付きプロパティに対してのみ保持される)を持つ限り、複数のプロパティが同じ名前を持つことが可能になることです。

したがって、通常、指定された型のすべてのプロパティを繰り返し処理し、少なくとも1つはあなたの名前とパラメータがないかどうかを確認する必要があります。

ただし、これはコーナーケースであり、無視するだけでよい場合があります。インデックス付きプロパティを考慮しない場合に発生する可能性があるいくつかの例外を認識させたかっただけです。

使用するアセンブリに影響を及ぼす可能性がある場合は、既にコメントに示されているようにインターフェイスを使用するほうがずっと良いです。

+0

そのために、 'GetProperty'メソッド(https://msdn.microsoft.com/en-us/library/kbchbb7e(v = vs.110).aspx)にオーバーロードがあります。 –

+0

@PatrickHofmanは、使用しているターゲットフレームワークによって異なります。ポータブルライブラリでは、リフレクションインターフェイスはほとんど完全に異なります。 – Georg

+0

その特定の方法がサポートされているので、実際の問題ではありません。 –

関連する問題