したがって、コンパイル時にエンティティタイプが文字通り知られていない、またはわかっていることが判明しました。それは文字列でなければなりません。
コンパイル時にタイプを使用している唯一の場所は、キャスト内で(DbSet<tableEntity>)
です。まあ、必要ないかもしれません。そのタイプから必要なのは、AsQueryable()
を呼び出すことです。AsQueryable()
は、IEnumerable
の拡張メソッドで、汎用バージョンと非汎用バージョンです。非汎用のIEnumerable
で呼び出すと、非汎用のAsQueryable()
となり、非汎用のIQueryable
が返されます。しかし、とにかくobject
を返しているので、ねえ。このことが有用であるという結果を得るには、とにかくどこかに何かが反映されなければならないので、宣言された型はほとんど影響を受けません。
これが動作するかどうかを参照してください:それはあなたが一般的なIQueryable<TEntityType>
を必要と判明した場合、我々は未知の(コンパイル時に)エンティティタイプのためAsQueryable<TEntityType>
ためMethodInfo
を取得するためにリフレクションを使用する必要があります
public object GetList(string tableEntity)
{
Type tableEntity = Type.GetType("TestProject." + typeName + ", TestProject");
var dbObject = (System.Collections.IEnumerable)
typeof(DbContext).GetMethod("Set", Type.EmptyTypes)
.MakeGenericMethod(tableEntity)
.Invoke(databaseContext, null);
return dbObject.AsQueryable();
}
、およびコールそれにMakeGenericMethod(tableEntity)
。
最初の試み:言語で
、ジェネリック医薬品への型パラメータは実際の種類、ないType
クラスのインスタンスでなければなりません。それはコンパイル時に解決されるからです。
しかし、これは問題ありません。型パラメータを汎用メソッドに渡すには、単に型パラメータを持つ汎用メソッドを記述します。
var stuff = GetList("MyTableEntityClass");
しかし、これは同じように良いです:あなたはこれを行うことはできません
var stuff = GetList<MyTableEntityClass>();
を...
public object GetList<TTableEntity>()
{
var dbObject = (DbSet<TTableEntity>)typeof(DbContext)
.GetMethod("Set", Type.EmptyTypes)
.MakeGenericMethod(typeof(TTableEntity))
.Invoke(databaseContext, null);
return dbObject.AsQueryable();
}
反射が異なっています。そのため、typeof(TTableEntity)
をMakeGenericMethod()
に渡しています。
そして、我々は、コンパイラがチェックできるという実際の型を使用していると、私たちも、私たちの戻り値の型をよりよく行うことができます。
以来
public IQueryable<TTableEntity> GetList<TTableEntity>()
{
var dbObject = (DbSet<TTableEntity>)typeof(DbContext)
.GetMethod("Set", Type.EmptyTypes)
.MakeGenericMethod(typeof(TTableEntity))
.Invoke(databaseContext, null);
return dbObject.AsQueryable();
}
:あなたは
Set<>
にあなたの心を設定した場合でも、これを試してみてください!あなたがそれを落とさない限り、あなたは常にこのような厄介なことに足を踏み入れます。 [コンパイラに関するイントロを読む](https://meta.stackexchange.com/questions/25840/can-we-stop-recommending-the-dragon-book-please)これはあなたが専門的に働いているツールです。それが原則的にどのように機能するかを知っていなければならない。 –DBがMS Sql Serverであるか、同じデータ型定義(https://stackoverflow.com/a/28561947/4228193)を使用している場合は、次のような便利な機能があります。すべての場所のSystem.Web。私は以下のように使います。 'TypeCode systc = Parameter.ConvertDbTypeToTypeCode([SqlMetaData_instance] .DbType); try { 返信Convert.ChangeType(val、systc); } ' – mpag