中で型を扱うとき、若干の役に立つ拡大.ネット


再利用可能なコードを書いている場合は、型、ジェネリック、およびインターフェイスを扱うコードを書くことができます.長年にわたって、私のヘルパー拡大のコレクションは、成長しました.私の今後のポストのいくつかがそれらを使用するように、私は将来の参照のためにそれらを共有する.

1型が他の型から派生しているかどうかを調べる
型の派生は一般的な慣習です.ある程度、パターンマッチングを使用できます.時々、それは十分ではありませんが(特に、マルチレベルの派生パスがある場合).これらの2つの拡張モジュールを使用したときです.
 public static bool IsDerivingFrom(this Type type, Type searchType) { if (type == null) throw new NullReferenceException(); return type.BaseType != null && (type.BaseType == searchType || type.BaseType.IsDerivingFrom(searchType)); } public static bool IsDerivingFromGenericType(this Type type, Type searchGenericType) { if (type == null) throw new ArgumentNullException(nameof(type)); if (searchGenericType == null) throw new ArgumentNullException(nameof(searchGenericType)); return type != typeof(object) && (type.IsGenericType && searchGenericType.GetGenericTypeDefinition() == searchGenericType || IsDerivingFromGenericType(type.BaseType, searchGenericType)); }

IEnumerableからTの型を取得する
場合によっては、IEnumerableの項目タイプを知る必要があります.この2つの拡張モジュールはこの場合に役立ちます.
 [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0060:Remove unused parameter", Justification = "Extension method")] public static Type GetItemType<T>(this IEnumerable<T> enumerable) => typeof(T); public static Type? GetItemType(this object enumerable) => enumerable == null ? null : (enumerable.GetType().GetInterface(typeof(IEnumerable<>).Name)?.GetGenericArguments()[0]);

3 .型があるインターフェイスを実装するかどうかを調べる
インターフェイスは、開発者の生活を容易にすることです.型導出と同様に、ある型が特定のインターフェイスを実装しているかどうかを知る必要があります.この拡張モジュールはあなたの質問に答えます.
 public static bool ImplementsInterface(this Type? type, Type? @interface) { bool result = false; if (type == null || @interface == null) return result; var interfaces = type.GetInterfaces(); if (@interface.IsGenericTypeDefinition) { foreach (var item in interfaces) { if (item.IsConstructedGenericType && item.GetGenericTypeDefinition() == @interface) result = true; } } else { foreach (var item in interfaces) { if (item == @interface) result = true; } } return result; }

外部アセンブリの型を検索する
外部アセンブリに住んでいるタイプを必要とするが、Name(またはFullName、それが適応するのは簡単です)があるだけであるなら、アセンブリがあなたのAppDomainに読み込まれる限り、これはあなたのためにタイプを解決します:
 public static Type? FindType(this string name) { Type? result = null; var nonDynamicAssemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic); try { result = nonDynamicAssemblies. SelectMany(a => a.GetExportedTypes()). FirstOrDefault(t => t.Name == name); } catch { result = nonDynamicAssemblies. SelectMany(a => a.GetTypes()). FirstOrDefault(t => t.Name == name); } return result; }

結論
私が最初に言ったように、このポストは将来の参考のために使われます.これらの拡張機能は、多くのコントロール、MVVMの実装とビジネスロジック私は過去(仕事と私の個人的なプロジェクトの両方)で書かれた全体をはるかに容易にしました.いつものように、このポストがあなたの一部に役立つことを願っています.
このGistの完全なクラスを見つけてください.

次の投稿まで、ハッピーコーディング!
Tim HillからのPixabayによるタイトルイメージ
ポストSome helpful extensions when dealing with types in .NETは、MSicc's Blogに最初に現れました.