我有两个并行的类层次结构,其中第一个层次结构用于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,但我这样做是为了获得额外的编译器检查。
我想这不是一个大问题,但我想知道是否有人知道解决方案。
答案 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();
}