さまざまな型とさまざまなアクションに対して繰り返される関数でいくつかの変数を作成する方法を単純化しようとしていますが、最終的には複数の型を処理できる単一の関数に移行しますが、段階的に行っています。オブジェクトの種類をどこにでもコピー/貼り付けする必要なく、リストの代わりにオブジェクトの種類のリストを作成できるようにしたいと考えています。私はこれを次のような本当に簡単なことで達成したいと思っていました
Type t = typeof(LinkAddy);
var x = List<t>();
しかし、これはコンパイルされません。
次に、次の回答で提供される別のソリューションを試しました:変数の型を保存し、それを使用して実行時にコレクションを作成する
static IList createGenericList(Type typeInList) {
var genericListType = typeof(List<>).MakeGenericType(new[] { typeInList });
return (IList)Activator.CreateInstance(genericListType);
}
と
static List<T> createGenericList<T>() {
List<T> genericListType = new List<T>();
return genericListType;
}
したがって、さまざまな方法とその結果は次のとおりです。
Type ThisType = typeof(LinkAddy);
// The normal list method, means I have to copy/paste LinkAddy everywhere
var fromQuery = new List<LinkAddy>();
// Makes a List, but I still have to put LinkAddy
var fromQuery_IsNew = createGenericList<LinkAddy>();
// Provides a List, I don't have to place LinkAddy
// but its a List<object> and not List<LinkAddy> so wherever I use
// the objects, I'll have to cast the object like
// string title = (fromQuery_IsDiff[0] as LinkAddy).Title;
var fromQuery_IsDiff = createGenericList(ThisType);
編集:最終的には、実行時に型がわかりません。関数はジェネリックになるため、LinkAddy を型または他の型として渡すことができ、必要に応じてリストが生成されます。最初のステップは、関数全体にジェネリックを配置することであり、より具体的にする必要があるものがないか型をチェックします。これは、データベース同期のリスト検証チェックに関係する約 200 行のコードをカバーする大規模な関数の一部です (キャッシュ バージョンとサーバー バージョンのどちらが新しいか、どちらが新しいかを判断し、あなたにはそうする権限があります)。WCF RIA サービスと SilverLight を使用してサーバー上の SQL データベースに同期する、LinkAddy に似た複数のクラスがあります。エントリは、XML シリアル化を実行し、XML ファイルをユーザーに保存するクラスにも格納されます。s システム (キャッシュ)。これにより、現場の担当者は、顧客の前にいる場合によくあることですが、インターネット接続なしでサイト データの大部分にアクセスできます。