12

我很少有具体使用以下类型的接口

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
    }
}

谢谢

4

2 回答 2

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>();
于 2012-11-06T11:55:53.837 回答
1

通常这是在lazyberezovsky的回答中实现的。在 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(); 

当然,这仅在您可以传递具体类型时才有效。如果您需要传递类型参数,事情会变得更加复杂。

于 2012-11-06T13:06:50.517 回答