我很少使用以下类型的接口
interface IActivity<T>
{
bool Process(T inputInfo);
}
具体类如下
class ReportActivityManager :IActivity<DataTable>
{
public bool Process(DataTable inputInfo)
{
// Some coding here
}
}
class AnalyzerActivityManager :IActivity<string[]>
{
public bool Process(string[] inputInfo)
{
// Some coding here
}
}
现在我怎样才能编写工厂类来重新调整通用接口,比如IActivity。
class Factory
{
public IActivity<T> Get(string module)
{
// ... How can i code here
}
}
由于
答案 0 :(得分:15)
您应该创建泛型方法,否则编译器将不知道返回值中T
的类型。如果您有T
,则可以根据T
的类型创建活动:
class Factory
{
public IActivity<T> GetActivity<T>()
{
Type type = typeof(T);
if (type == typeof(DataTable))
return (IActivity<T>)new ReportActivityManager();
// etc
}
}
用法:
IActivity<DataTable> activity = factory.GetActivity<DataTable>();
答案 1 :(得分:1)
这通常是在lazyberezovsky's answer中实现的。在c ++中,当您尝试创建工厂无法处理的类型时,您可以使用模板特化来获取编译器错误。
你不能在C#中做到这一点,但你可以接近。虽然代码可能看起来有点令人惊讶,但反过来可能会成为一个问题。
public static class Factory {
public static IActivity<someType> Get(this someType self){
//stuff specific to someType
}
public static IActivity<someOtherType> Get(someOtherType self){
//stuff specific to someOtherType
}
public static T Creator<T>(){
return null;
}
}
然后使用
IActivity<someType> act = Factory.Creator<someType>().Get();
当然,这只有在您传递具体类型时才有效。如果你需要传递一个类型参数,事情会变得更复杂。