3

さまざまな型とさまざまなアクションに対して繰り返される関数でいくつかの変数を作成する方法を単純化しようとしていますが、最終的には複数の型を処理できる単一の関数に移行しますが、段階的に行っています。オブジェクトの種類をどこにでもコピー/貼り付けする必要なく、リストの代わりにオブジェクトの種類のリストを作成できるようにしたいと考えています。私はこれを次のような本当に簡単なことで達成したいと思っていました

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 システム (キャッシュ)。これにより、現場の担当者は、顧客の前にいる場合によくあることですが、インターネット接続なしでサイト データの大部分にアクセスできます。

4

1 に答える 1

2

特にコメントを考えると、これがどのように機能する可能性があるかは明確ではありません。

// 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;

にキャストするのに十分なことがわかっている場合LinkAddy(これは、IMOを使用するよりもキャストとしてas行う方がよいでしょう)、コンパイル時に型が明確にわかります。コンパイル時に型がわかっている場合は、それを型引数として指定してください。

のようなものは、コンパイル時に関連する型がわからないMakeGenericType場合に役立ちます。つまり、キャストできないことを意味します...とにかく、型について知っている他のことはどれも使用できません。

代わりに動的型付けを使用できる可能性があります...しかし、Titleプロパティがあることがわかっている場合、おそらく本当に必要なのは、代わりに共通性を表現するインターフェイスです。次に、そのインターフェイスに制約があるジェネリック メソッドを潜在的に使用できます。

とにかく、コンパイル時に知っていることと、実行時にしか知らないことについて考えるべきです。ほとんどの場合、ジェネリックはコンパイル時に既知の型を対象としています...実行時にリフレクションを介してジェネリックを使用することは可能ですが、それは一種の設計との戦いであるため、イライラしても驚かないでください。

于 2013-03-13T23:38:28.173 に答える