[解決済み] Assembly.GetTypes()呼び出し時にReflectionTypeLoadExceptionが発生しないようにする方法
2022-10-31 09:29:55
質問
私は、以下のようなコードを使って、特定のインターフェイスを実装している型についてアセンブリをスキャンしようとしています。
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
私の問題は
ReflectionTypeLoadException
を呼び出したときに
asm.GetTypes()
を呼び出した場合、例えば、アセンブリに現在利用できないアセンブリを参照する型が含まれている場合などです。
私の場合、問題の原因となる型には興味がありません。私が検索している型は、利用不可能なアセンブリを必要としないのです。
質問は、例外を引き起こす型をどうにかしてスキップ/無視し、アセンブリに含まれる他の型をまだ処理することは可能でしょうか。
どのように解決するのですか?
かなり厄介な方法としては
Type[] types;
try
{
types = asm.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types = e.Types;
}
foreach (var t in types.Where(t => t != null))
{
...
}
こんなことをしなければならないのは、確かに煩わしいですが。拡張メソッドを使って、quot;client"コードでよりきれいにすることができます。
public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)
{
// TODO: Argument validation
try
{
return assembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
return e.Types.Where(t => t != null);
}
}
を移動させたいと思うかもしれません。
return
ステートメントをキャッチブロックの外に出したいと思うかもしれません - 私自身はそこにあることをあまり気にしていませんが、それはおそらく
は
が最短のコードです...
関連
-
[解決済み] enumを列挙するには
-
[解決済み] JavaScriptでクエリ文字列の値を取得するにはどうすればよいですか?
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アセンブリから型を読み込めなかったエラー
-
[解決済み] Visual Studioの "ターゲットフレームワーク "が見つからない
-
[解決済み] asp.netでWebサービスのタイムアウト時間を長くする方法は?
-
[解決済み] データテーブルがすでに別のデータセットに属している
-
[解決済み] 権限 '*' を持つ SSL/TLS の安全なチャネルを確立できませんでした。
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] 列挙型を文字列に変換する
-
[解決済み] あるインタフェースを実装しているすべての型を取得する
-
[解決済み] LINQクエリでToList()とToArray()のどちらを呼び出すのが良いですか?
-
[解決済み] HashSetとListの性能比較