繁体   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