2012-09-17 15 views

答えて

22

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

[ClassNameOfContext]に対し

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

は、CTXがのインスタンスであるクラスの名前です。これはあなたのコードから明らかにされていませんが、あなたは問題がenumerableobjectこととEntityTypeはあなたがアクセスしているエンティティのタイプであるIEnumerable<EntityType>にキャストする必要があるということです:-)

それを知っています。言い換えれば、あなたが渡す名前に依存します。ジェネリックを使用して型を判別すると、オブジェクトを適切にキャストでき、dynamicを返す必要はありません。

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

と上からラインを変換:あなたが行く

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

補足説明文字列の型やプロパティの名前をタイプセーフではないため、可能な限り避けるべきです。コンパイラはそれを認識せず、リファクタリングなどのIDE機能はそれを考慮しません。ここで問題となるのは、プロパティ名は通常、エンティティタイプ名の複数形であるということです。しかし、リフレクションを使用して、型がTEntityと一致するプロパティを見つけることができます。

var branchList = GetList<Branch>("connectionStringName", x => (Branch)x); 

あなたは.AsNoTrackingを(削除)して削除することができ.ToList:私はあなたがこのように呼び出すには、この

private IEnumerable<TEntity> GetList<TEntity>(string connectionString, Func<object, T> caster) 
{ 
    using (var ctx = new DbContext(connectionString)) 
    { 
     var setMethod = ctx.GetType().GetMethod("Set").MakeGenericMethod(typeof(T)); 

     var querable = ((DbSet<object>)setMethod 
     .Invoke(this, null)) 
     .AsNoTracking() 
     .AsQueryable(); 

     return querable 
      .Select(x => caster(x)) 
      .ToList(); 
    } 
} 

のようなコードを使用することができます

+0

反射を使用してこれを行うにはどうすればよいですか? GetDataの戻り値の型は動的なので、ToListによって返される型は関係ありません。したがって、任意の型にすることができます – user1209216

+0

@ user1209216 - 私は自分の答えを更新しました。 – chiccodoro

+0

@ user1209216 - あなたは私のように問題を回避するためにダイナミックを使用しています。 'dynamic'キーワードは慎重に使うべきです。それは使用するのが妥当である非常に特定のユースケースを持っていますが、あなたのケースでは戻り値の型を強くタイプすることができます。これが好ましい方法です。 – chiccodoro

0

:-)練習としてこれを残します()を呼び出すと、純粋なIQueryableが取得され、さらにクエリできます。

関連する問題