15

次のコードがあります(例):

public dynamic GetData(string name) 
{
    using(var ctx = GetObjectContext()) 
    {
        switch (name) 
        {
        case "entity1":
            return ctx.entity1.ToList();
        case "entity2":
            return ctx.entity2.ToList();
        ......
        default:
            return null;
        }
    }
}

このサンプルでは switch を避けたいと思います。必要なエンティティ クラスを名前で見つけ、ToList() メソッドを呼び出してデータを返すにはどうすればよいですか? リフレクションを使用してこれを行うことはできますか?

4

2 に答える 2

23

リフレクションを使用してそれを行うことができますが、ToList() メソッドによって返されるリストのタイプはエンティティ タイプごとに異なるため、ジェネリックも使用する必要があります。

次のように、リフレクションを介してプロパティ ゲッターにアクセスできます。

var enumerable = typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null);

一方[ClassNameOfContext]、 は ctx がインスタンスであるクラスの名前です。これはあなたのコードからは明らかではありませんが、あなたはそれを知っています:-)

問題は、アクセスしているエンティティのタイプである場所にキャストするenumerable必要があることです。つまり、渡す名前によって異なります。ジェネリックを使用して型を決定すると、オブジェクトを適切にキャストでき、偶数を返す必要がなくなります。objectIEnumerable<EntityType>EntityTypedynamic

public TEntity Get<TEntity>(string name)
{
    ...

上から行を変換します。

var enumerable = (IEnumerable<TEntity>)(typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null));
return enumerable.ToList();

どうぞ!

補遺: おそらく、文字列パラメーターも取り除くことができます。タイプセーフではないため、文字列に型またはプロパティの名前を含めることは可能な限り避ける必要があります。コンパイラはそれを認識せず、リファクタリングなどの IDE 機能はそれを考慮しません。ここでの問題は、通常、プロパティ名がエンティティ タイプ名の複数形であることです。ただし、リフレクションを使用して、タイプがTEntity. これは演習として残します:-)

于 2012-09-17T08:16:21.383 に答える