[英]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.