[英]generic call of class in c#
SlovenianSearchQueryManager.ApplySloveniaQueries(rawQuery, page, pageSize, orderBy, out count);
是否可以通過將HttpContext.Current.Session [“ lang_name”]和“ SearchQueryManager”合並來獲取SlovenianSearchQueryManager類;
HttpContext.Current.Session [“ lang_name”]是斯洛文尼亞語,所以一起是SlovenianSearchQueryManager
下次
HttpContext.Current.Session [“ lang_name”]是德語,所以一起是GermanSearchQueryManager
我試圖使這種通用而不是
if (HttpContext.Current.Session["lang_name"] == "Slovenian)
{
SlovenianSearchQueryManager.ApplySloveniaQueries(rawQuery, page, pageSize, orderBy, out count);
}
else ...
我想做類似的東西
(HttpContext.Current.Session["lang_name"] + "SearchQueryManager").ApplySloveniaQueries(...
是否有可能做出這樣的事情,例如存在SlovenianSearchQueryManager類型,它在不同的類庫中。
您應該使用每種語言的實現制作一個ISearchQueryManager
接口,然后使用Dictionary<string, ISearchQueryManager>
獲取所需語言的實現。
使用Type.GetType和Activator.CreateInstance :
var queryManagerType = Type.GetType(HttpContext.Current.Session["lang_name"] + "SearchQueryManager");
var queryManager = Activator.CreateInstance(queryManagerType);
Activator.CreateInstance返回一個對象。 您可能想要定義查詢管理器將需要實現的接口。
public interface ISearchQueryManager {
void ApplyQueries(/* add parameters here */);
}
然后,您可以將CreateInstance返回的對象強制轉換為接口:
var queryManagerType = Type.GetType(HttpContext.Current.Session["lang_name"] + "SearchQueryManager");
var queryManager = (ISearchQueryManager)Activator.CreateInstance(queryManagerType);
queryManager.ApplyQueries(rawQuery, page, pageSize, orderBy, out count);
我建議進行兩個更改。
首先,使您的所有“ SearchQueryManager”實例都源自一個公共接口(或基類),例如ISearchQueryManager
。
其次,創建一個Dictionary<string, ISearchQueryManager>
,並使用它根據您的類型查找適當的Dictionary<string, ISearchQueryManager>
。
然后,您可以執行以下操作:
ISearchQueryManager manager;
if (!managers.TryGetValue(HttpContext.Current.Session["lang_name"], out manager))
{
// Unknown language - handle this!
}
else
{
manager.ApplyQuery(...);
}
您正在查看工廠模式。 使用所需的查詢方法定義一個接口,例如IQueries。 然后定義一個使用您的語言並返回IQueries的工廠類。 對於斯洛文尼亞,請返回您的SlovenienSearchQueryManager。 等其他語言。
聽起來您正在嘗試創建工廠模式,這將成為IMO解決此問題的正確方法。
我將調查使用工廠類來創建您的查詢管理器。
偽代碼:
var factory= new QueryManagerFactory();
var queryManager = factory.Create("Slovenian");
在工廠創建方法中,根據輸入返回所需的查詢管理器的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.