简体   繁体   English

C#中类的泛型调用

[英]generic call of class in c#

SlovenianSearchQueryManager.ApplySloveniaQueries(rawQuery, page, pageSize, orderBy, out count);

is it possible to get SlovenianSearchQueryManager class by concatinating HttpContext.Current.Session["lang_name"] and "SearchQueryManager"; 是否可以通过将HttpContext.Current.Session [“ lang_name”]和“ SearchQueryManager”合并来获取SlovenianSearchQueryManager类;

HttpContext.Current.Session["lang_name"] is Slovenian so together is SlovenianSearchQueryManager HttpContext.Current.Session [“ lang_name”]是斯洛文尼亚语,所以一起是SlovenianSearchQueryManager

next time 下次

HttpContext.Current.Session["lang_name"] is German so together is GermanSearchQueryManager HttpContext.Current.Session [“ lang_name”]是德语,所以一起是GermanSearchQueryManager

i try to make this generic instead of making 我试图使这种通用而不是

if (HttpContext.Current.Session["lang_name"] == "Slovenian)
{ 
SlovenianSearchQueryManager.ApplySloveniaQueries(rawQuery, page, pageSize, orderBy, out count);
} 
else ...

i want to make something like 我想做类似的东西

(HttpContext.Current.Session["lang_name"] + "SearchQueryManager").ApplySloveniaQueries(...

is this even possible to make something like this and the type SlovenianSearchQueryManager for example exists, it's in a different class library. 是否有可能做出这样的事情,例如存在SlovenianSearchQueryManager类型,它在不同的类库中。

您应该使用每种语言的实现制作一个ISearchQueryManager接口,然后使用Dictionary<string, ISearchQueryManager>获取所需语言的实现。

Use Type.GetType and Activator.CreateInstance : 使用Type.GetTypeActivator.CreateInstance

var queryManagerType = Type.GetType(HttpContext.Current.Session["lang_name"] + "SearchQueryManager");
var queryManager = Activator.CreateInstance(queryManagerType);

Activator.CreateInstance returns an object. Activator.CreateInstance返回一个对象。 You might want to define an interface that you query managers will need to implement. 您可能想要定义查询管理器将需要实现的接口。

public interface ISearchQueryManager {
    void ApplyQueries(/* add parameters here */);
}

Then you can cast the object returned by CreateInstance to the interface: 然后,您可以将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);

I would recommend making two changes. 我建议进行两个更改。

First, make all of your "SearchQueryManager" instances derive from a common interface (or base class), such as ISearchQueryManager . 首先,使您的所有“ SearchQueryManager”实例都源自一个公共接口(或基类),例如ISearchQueryManager

Second, make a Dictionary<string, ISearchQueryManager> , and use it to lookup the appropriate one based on your type. 其次,创建一个Dictionary<string, ISearchQueryManager> ,并使用它根据您的类型查找适当的Dictionary<string, ISearchQueryManager>

You could then do: 然后,您可以执行以下操作:

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

You're looking at the factory pattern. 您正在查看工厂模式。 Define an interface, like IQueries with the queries methods you need. 使用所需的查询方法定义一个接口,例如IQueries。 Then define a factory class that takes your language and returns an IQueries. 然后定义一个使用您的语言并返回IQueries的工厂类。 For slovenia, return your SlovenienSearchQueryManager. 对于斯洛文尼亚,请返回您的SlovenienSearchQueryManager。 Etc for other languages. 等其他语言。

It sounds like you're trying to work around creating a factory pattern, which would, IMO, be the correct way to solve this problem. 听起来您正在尝试创建工厂模式,这将成为IMO解决此问题的正确方法。

http://aspalliance.com/809 http://aspalliance.com/809

I would investigate using a factory class to create your query managers. 我将调查使用工厂类来创建您的查询管理器。

Pseudo-code: 伪代码:

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

In your factory create method return the type of query manager you want based upon the input. 在工厂创建方法中,根据输入返回所需的查询管理器的类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM