是的,你不能只传递A
,因为A
不是基类,它是泛型类而且自身并不存在。
C#在编译时生成泛型类,这意味着如果你在代码中使用A<B>
,C#会生成类似以下的内容:
public class generated_A_B
{
public bool Success { get; set; }
public string Reason { get; set; }
public B Data { get; set; }
}
如果没有明确使用,将不会为A<C>
生成任何内容。原因很明显,如果为每个A的组合生成类,则会使代码臃肿。
在当前情况下,最好直接显式调用它们。
void Main()
{
CallAB();
CallAC();
}
A<B> CallAB()
{
return ServiceCall<A<B>>("/api/ab");
}
A<C> CallAC()
{
return ServiceCall<A<C>>("/api/ac");
}
如果您真的想要获得“通用”的A
,您应该将A
变成一个实际的基类,并让API返回Data
的类型。在我的示例中,我只使用了类型的Name
,但您可能应该使用包含命名空间的FullName
,以避免名称冲突。
void Main()
{
var json = @"
{
""success"": true,
""reason"": ""All good"",
""type"": ""B"",
""data"": {
""token"": ""1234-5678""
}
}";
var foo = JsonConvert.DeserializeObject<A>(json);
var type = Assembly.GetExecutingAssembly().GetTypes().Where(i => i.IsClass && i.Name == foo.Type).FirstOrDefault();
if (type == null)
{
throw new InvalidOperationException(string.Format("Type {0} not found", foo.Type));
}
var data = foo.Data.ToObject(type);
}
public class A
{
public bool Success { get; set; }
public string Reason { get; set; }
public string Type { get; set; }
public JToken Data { get; set; }
}
public class B
{
public string Token { get; set; }
}
async Task<T1> MyTask<T1,T2>(...) where T2 : class where T1 : A<T2>
- 然后你可以反序列化var foo = JsonConvert.DeserializeObject<T1>(response.Content)
并调用你的 Web 服务await MyTask<A<B>, B>()
。 - undefined