簡體   English   中英

C#中類的泛型調用

[英]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.GetTypeActivator.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解決此問題的正確方法。

http://aspalliance.com/809

我將調查使用工廠類來創建您的查詢管理器。

偽代碼:

var factory= new QueryManagerFactory();
var queryManager = factory.Create("Slovenian");

在工廠創建方法中,根據輸入返回所需的查詢管理器的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM