![](/img/trans.png)
[英]Create instance of class with generic type and call method of same generic type from string name of object at runtime
[英]Call EF Core method with generic type from type name
我有一個應用程序記錄要在以后執行的查詢列表。 所以我有一個包含這樣的列表:
class QueryToBeExecutedLater
{
string sql { get; set; }
object[] parameters { get; set; }
string entityTypeFullName { get; set; }
}
我需要像這樣執行它們:
List<QueryToBeExecutedLater> allQueries = ...
foreach(var q in allQueries )
{
Type elementType = Type.GetType(q.entityTypeFullName);
var result = await db.Set<elementType>.FromSqlRaw(q.sql,q.parameters).ToListAsync();
}
但它當然行不通。
我對反射不是很熟悉。 到目前為止,我已經能夠通過以下方式獲得 dbSet:
List<QueryToBeExecutedLater> allQueries = ...
foreach(var q in allQueries )
{
Type elementType = Type.GetType(q.entityTypeFullName);
MethodInfo method = typeof(myDbContext).GetMethod("Set",
BindingFlags.Public | BindingFlags.Static);
method = method.MakeGenericMethod(elementType);
var _dbSet = method.Invoke(db,null);
var result = _dbSet.FromSqlRaw(q.sql,q.parameters);
}
這當然行不通,因為:
我可能應該做這樣的事情:
List<QueryToBeExecutedLater> allQueries = ...
foreach(var q in allQueries )
{
Type elementType = Type.GetType(q.entityTypeFullName);
MethodInfo method = typeof(myDbContext).GetMethod("Set",
BindingFlags.Public | BindingFlags.Static);
method = method.MakeGenericMethod(elementType);
var _dbSet = method.Invoke(db,null);
var typeReturnedByInvoke_type_of_dbset = **...How Do I Get this type?...**
MethodInfo _method = typeReturnedByInvoke_type_of_dbset.GetMethod("FromSqlRaw",
BindingFlags.Public | BindingFlags.Static);
object[] frontParameter = { sql };
var allParameters = frontParameter.Concat(parameters).ToArray();
// The "null" is because it's a static method
var result = _method.Invoke(_dbSet, allParameters);
}
但是如何獲得method.Invoke
結果的類型?
或者有沒有辦法避免所有這些調用,只需將第一次調用的結果轉換為正確的DbSet<elementType>
並從那里繼續而不進行反射?
預先感謝您的任何幫助!
您已經知道如何通過反射調用單個泛型方法,這就是您所需要的。 只需引入一個RunQuery<TEntity>
並調用它。
例如
public static List<object> RunQuery(QuerySpec query, DbContext db)
{
Type elementType = Type.GetType(query.entityTypeFullName);
var rv = typeof(Program).GetMethod("RunQuery2", BindingFlags.Static | BindingFlags.NonPublic)
.MakeGenericMethod(elementType)
.Invoke(null, new object[] { query, db });
return (List<Object>)rv;
}
private static List<object> RunQuery2<T>(QuerySpec query, DbContext db) where T : class
{
var rv = db.Set<T>().FromSqlRaw(query.sql, query.parameters)
.Select( e=>(object)e )
.ToList();
return rv;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.