c#中类的通用调用

时间:2011-01-18 18:10:43

标签: 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,它位于不同的类库中。

6 个答案:

答案 0 :(得分:3)

您应该为每种语言的实现创建一个ISearchQueryManager接口,然后使用Dictionary<string, ISearchQueryManager>来获得所需语言的实现。

答案 1 :(得分:2)

使用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);

答案 2 :(得分:2)

我建议做两处修改。

首先,使所有“SearchQueryManager”实例派生自一个公共接口(或基类),例如ISearchQueryManager

其次,制作一个Dictionary<string, ISearchQueryManager>,并根据您的类型使用它来查找合适的一个。

然后你可以这样做:

 ISearchQueryManager manager;
 if (!managers.TryGetValue(HttpContext.Current.Session["lang_name"], out manager))
 {
     // Unknown language - handle this!
 }    
 else
 {
       manager.ApplyQuery(...);
 }

答案 3 :(得分:1)

你正在看工厂模式。使用您需要的查询方法定义一个接口,如IQueries。然后定义一个采用您的语言并返回IQueries的工厂类。对于斯洛文尼亚,请返回您的SlovenienSearchQueryManager。等其他语言。

答案 4 :(得分:1)

听起来你正在努力创建一个工厂模式,IMO将是解决这个问题的正确方法。

http://aspalliance.com/809

答案 5 :(得分:0)

我会调查使用工厂类来创建查询管理器。

伪代码

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

在工厂中,create方法根据输入返回所需的查询管理器类型。

善,

d