3

ISurface<T>任意のタイプのインターフェイスを実装するすべてのプラグインを検出する必要があるプラグイン アーキテクチャがあります(つまり、 のテストISurface<>)。ここには LINQ を使用したいくつかの提案 (例: this one ) があり、これよりも優先する理由があるかどうか疑問に思っています。

.GetType().GetInterface("ISurface`1")

編集:インターフェース名のハードコーディングに関しては、ティムが以下で述べたように、名前が実際のインターフェースから直接抽出された場合、これらの懸念は軽減されると思います:

.GetType().GetInterface(typeof(ISurface<>).FullName)

名前空間のあいまいさに .FullName も問題はないはずです。ハードコーディングはさておき、一連の型プロパティ チェック / LINQ 構文を実行するよりも短くてきれいに見えるため、アプローチ自体に主に興味があります。繰り返しますが、ボンネットの下で何が起こっているのかわかりません。

4

5 に答える 5

0

これを実行したくない理由として、いくつかの理由が考えられます。

  1. "ISurface`1"有効でなくなるようにコードをリファクタリングした場合 (たとえば、型パラメーターを追加または削除したり、インターフェイスの名前を変更したり)、コンパイラはそれをキャッチしません。に置き換えることで解決できますtypeof(ISurface<>).Name
  2. ISurface<>別の名前空間にある場合、それはあいまいです (または、少なくとも一見しただけではそう見えます)。

私はおそらく、あなたがリンクしたソリューションを使用するでしょう。おそらく、拡張メソッドにラップして、より簡単に呼び出すことができます。

public static Type GetInterface(this Type type, Type targetType)
{
    return type.GetInterfaces().SingleOrDefault(t => t.IsGenericType
                          && t.GetGenericTypeDefinition() == targetType);
}
public class Surface : ISurface<int> { /* ... */ }

typeof(Surface).GetInterface(typeof(ISurface<>)); //returns typeof(ISurface<int>)
typeof(NotASurface).GetInterface(typeof(ISurface<>)); //returns null
于 2013-11-04T19:21:06.810 に答える
0

(名前空間を含む完全に指定されたクラス名ではなく) インターフェイスの「単純な」名前だけでチェックすると、別の名前空間に同じ名前の別のインターフェイスがある場合に問題が発生します。

完全に指定されたクラス名でメソッドを呼び出すとGetInterface、問題なく動作するはずです。

MSDNでは、ジェネリック型の場合はマングル名を指定する必要があると具体的に述べているため、正常に機能することが期待されます。

もちろん、それが最善の方法であれば、議論することができます。インターフェイス名を変更すると、問題が発生します。

于 2013-11-04T19:17:45.803 に答える