绑定两个通用类型

时间:2014-06-28 11:12:55

标签: c# generics traits

我有两个并行的类层次结构,其中第一个层次结构用于API,而第二个层次结构用于模型层。 相同的类型在每个层次结构中都有一个表示(类),我想'绑定' (更晚些时候)这两个类是为了使用泛型。

      API
     /   \
 ApiA     ApiB

     Model
     /   \
ModelA    ModelB

例如,一旦这个功能

public string DoSomething<APIType> (APIType value) {

获取APIType作为参数(例如ApiB),我想调用关联的泛型方法,该方法将ModelType作为类型参数(在本例中为ModelB)。

我尝试过类似的东西:     public String DoSomething(ApiType value)其中ModelType:Model其中ApiType:API

但我发现C#不能做部分推理,所以这个:

class ApiB : Api<ModelB> {}

ApiB obj;
DoSomething(obj) 

无法工作(两种类型参数都是必需的)

我尝试实现类似于C ++特性的东西,但它没有用。 可以只使用Type,但我这样做是为了获得额外的编译器检查。

我想这不是一个大问题,但我想知道是否有人知道解决方案。

1 个答案:

答案 0 :(得分:1)

这是一个非常复杂的问题。检查此代码,我已使用associated generic method的通用构造函数替换了List调用。如果您质疑的内容与我对问题的理解存在差异,请注释。

class Program
{
    public class Model { }

    public class ModelB : Model { }

    public class Api<T> where T : Model
    {
        public List<T> CallGenericMethod()
        {
            return new List<T>();
        }
    }

    public class ApiB: Api<ModelB> { }

    public static string DoSomething<T>(Api<T> a) where T : Model
    {
        var b = a.CallGenericMethod();
        return b.GetType().ToString();
    }

    static void Main(string[] args)
    {
        ApiB a = new ApiB();
        Console.WriteLine(DoSomething(a));
    }
}

编辑两种类型的通用版

public class Api<TApi, TModel> where TApi: Api<TApi, TModel> where TModel : Model
{
    public List<TModel> CallGenericMethod()
    {
        return new List<TModel>();
    }
}

public class ApiB: Api<ApiB, ModelB> { }

public static string DoSomething<TApi, TModel>(Api<TApi, TModel> a) where TApi : Api<TApi, TModel> where TModel: Model
{
    return new Dictionary<TApi, TModel>().GetType().ToString();
}