2017-11-13 8 views
0

私はEntity FrameworkとLINQを使用しています。私は、GridViewの "ヘルパー"クラスで再利用可能なメソッドを作成したいと思います。スイッチを使用せずにGetType()から派生した型を使用します。

このメソッドは、渡されたエンティティのタイプに基づいてエンティティのリストとしてDataSourceを返します。私は、私は提案を開いています方法で文字列としてしたいエンティティ型を渡す必要がある場合は

GridView1.DataSource = helperClass.GetDataSource(new Entity1()); 

注*:呼び出しは次のようになりますので

のでGridView1はの[Entity1]が表示されます。私はこの方法が

を返すことができ、再利用可能な方法は簡単であるとのようになります〜40のエンティティタイプ間のスイッチケースを使用する必要がありますする必要はありません:

public static object GetDataSource(object type) 
{ 
    using (DatabaseContext dc = new DatabaseContext()) 
    { 
     if (dc.[how do I get the entity type here].Count() > 0) 
     { 
      var modelList = dc.[how do I get the entity type here also].ToList(); 
     } 
    } 
} 

これは愚かな音が鳴ります、しかし明らかに私はできませんでした:

var modelList = dc.(type.GetType()).ToList(); 

しかし、それは私が達成したいものです。

+0

何が良いこと、あなたのですか?あなたはオブジェクトのリストを取得しますが、コンパイル時にその型を知らないのですか?私はジェネリック医薬品であなたが望むことをする良い方法があると思う。 –

+0

これは、https://stackoverflow.com/questions/1919632と重複していますが、最初にタイプから名前を取得する必要があるという違いがあります。 –

+0

@DStanley非常に良いかもしれません。これは、再利用可能なヘルパーメソッドを作成しようとしたときに考えた最初のアプローチに過ぎませんでした。私は類似したメソッド(ソート、バインド、データバインドなど)を持つ複数のGridViewを持つWebアプリケーションを持っているので、同じコードをタイプするのではなく、これらのメソッドのリモートクラスで再利用可能なメソッドを作成したいGridView)〜40 times – toadfromgrove

答えて

0

あなたはコンパイル時にタイプをバインドしたい場合は、ジェネリック引数として型を渡すと、このタイプの方法を使用することができます。

 public DbSet<T> GetDataSource<T>() 
     { 
      var targetType = typeof(DbSet<T>); 

      return _db 
       .GetType() 
       .GetMethods() 
       .Where(m => m.ReturnType == targetType) 
       .Single() 
       .Invoke(_db, null) as DbSet<T>; 
     } 

それが動作しない方法は?リクエストされているエンティティを返すメソッドの名前はわかりませんが、戻り値の型はDbSet<T>でなければなりません。そこで、その型を返すメソッドのDatabaseContextをスキャンし、それを呼び出します。これは、その戻り値の型を持つメソッドが1つしかないことを前提としています。

実際の実行時バインディング(<T>パラメータを指定することはできません)が必要な場合は、この種のメソッドを使用できます。コンパイル時に特定できない場合は、特定の戻り値の型を持つことができないので、戻り値の型は一般的にはIEnumerableです。必要に応じていつでもDbSet<T>にキャストすることができます。

完全な例です。私はEFオブジェクトをスタブアウトしましたが、この例でも実際のDbSetDatabaseContextで動作するはずです。

using System; 
using System.Linq; 
using System.Collections; 
using System.Collections.Generic; 

public class Program 
{ 

    public class DbSet<T> : List<T> 
    { 
    } 

    public class User 
    { 
     public string Name { get; set; } 
     public override string ToString() 
     { 
      return "User " + Name; 
     } 
    } 

    public class Transaction 
    { 
     public decimal Amount { get; set; } 
     public override string ToString() 
     { 
      return "Transaction " + Amount.ToString("0.00"); 
     } 
    } 

    public class DatabaseContext 
    { 
     public DbSet<User> GetUsers() 
     { 
      return new DbSet<User>() 
      { 
       new User { Name = "Bob" }, 
       new User { Name = "Alice" } 
      }; 
     } 
     public DbSet<Transaction> GetTransactions() 
     { 
      return new DbSet<Transaction>() 
      { 
       new Transaction { Amount = 12.34M }, 
       new Transaction { Amount = 56.78M } 
      }; 
     } 

    } 

    public class HelperClass 
    { 
     private readonly DatabaseContext _db; 

     public HelperClass(DatabaseContext db) 
     { 
      _db = db; 
     } 

     public DbSet<T> GetDataSource<T>() 
     { 
      var targetType = typeof(DbSet<T>); 

      return _db 
       .GetType() 
       .GetMethods() 
       .Where(m => m.ReturnType == targetType) 
       .Single() 
       .Invoke(_db, null) as DbSet<T>; 
     } 

     public IEnumerable GetDataSource(Type type) 
     { 
      var targetType = typeof(DbSet<>).MakeGenericType(new Type[] { type }); 

      return _db 
       .GetType() 
       .GetMethods() 
       .Where(m => m.ReturnType == targetType) 
       .Single() 
       .Invoke(_db, null) as IEnumerable; 
     } 
    } 

    public static void Main() 
    { 
     var helperClass = new HelperClass(new DatabaseContext()); 

     foreach (var u in helperClass.GetDataSource<User>()) 
     { 
      Console.WriteLine(u); 
     } 

     foreach (var t in helperClass.GetDataSource(typeof(Transaction))) 
     { 
      Console.WriteLine(t); 
     } 

    } 
} 

出力:

User Bob 
User Alice 
Transaction 12.34 
Transaction 56.78 

Full code on DotNetFiddle

関連する問題