6

Visual Studio 2012 パッケージを作成しました (VS2012 SDK を使用)。この拡張機能 (クライアントの IDE 環境にインストールされている場合) には、とりわけ、開発者が作業している現在開いているソリューションからすべての特定の型を収集する機能が必要です。同様の機能が ASP.NET MVC アプリケーション プロジェクトの Visual Studio デザイナーに組み込まれています。開発者はモデル/コントローラー クラスを実装し、プロジェクトをビルドしてから、スキャフォールディング UI (デザイナーのドロップダウン リスト) でこの型にアクセスできます。対応する機能は、WPF、WinForms Visual Designers などでも利用できます。

私の拡張機能が、ISerializableインターフェイスを実装する現在のソリューションからすべての型を収集する必要があるとしましょう。手順は次のとおりです。開発者は特定のクラスを作成し、プロジェクト/ソリューションを含む再構築を行い、拡張 UI によって提供される何らかのアクションを実行します。したがって、ISerializable型収集の実行が含まれます。

リフレクションを使用して収集操作を実装しようとしました:

List<Type> types = AppDomain.CurrentDomain.GetAssemblies().ToList()
                  .SelectMany(s => s.GetTypes())
                  .Where(p => typeof(ISerializable).IsAssignableFrom(p) && !p.IsAbstract).ToList();

ただし、上記のコードではSystem.Reflection.ReflectionTypeLoadException例外がスローされます。

System.Reflection.ReflectionTypeLoadException was unhandled by user code
  HResult=-2146232830
  Message=Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
  Source=mscorlib
  StackTrace:
       at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
       at System.Reflection.RuntimeModule.GetTypes()
       at System.Reflection.Assembly.GetTypes()
(...)  
LoaderException: [System.Exception{System.TypeLoadException}]
{"Could not find Windows Runtime type   'Windows.System.ProcessorArchitecture'.":"Windows.System.ProcessorArchitecture"}
(...)

現在ビルドされているソリューションから特定の型を収集する操作を適切に実装するにはどうすればよいですか?

4

2 に答える 2

0

私があなたを正しく理解しているかどうかはわかりませんが、もし私が理解していれば、次のようになります。

var assembly = Assembly.GetExecutingAssembly();
IEnumerable<Type> types = 
      assembly.DefinedTypes.Where(t => IsImplementingIDisposable(t))
                           .Select(t => t.UnderlyingSystemType);

........

private static bool IsImplementingIDisposable(TypeInfo t)
{
     return typeof(IDisposable).IsAssignableFrom(t.UnderlyingSystemType);
}
于 2013-10-02T17:49:02.020 に答える