调用外部 Api return 接口的方法
A method which call an external Api return an interface
我使用 restsharp 来消耗外部 API。
我有一个 class 扩展接口
public interface ICarInfo
{
ICarDetails GetCarInfo(string car);
}
public interface ICarDetails
{
string Color { get; set; }
string MaxSpeed { get; set; }
string Acceleration{ get; set; }
}
我创建了扩展此接口的 class 并使用 restsharp
实现了此方法
public ICarDetails GetCarInfo(string car)
{
var client = new RestClient("http://xxx.xxxxxxx.com");
var request = new RestRequest("/{car} ? access_key =xxxxxxxxx", Method.GET);
var queryResult = client.Get<ICarDetails >(request).Data;
return queryResult;
}
现在我在这一行中收到错误:
var queryResult = client.Get<ICarDetails >(request).Data;
ICarDetails must be a non-abstract type with a public parameterless
constructor in order to use it as a parameter T in the generic type or
method
为了能够反序列化请求数据,需要一个具体的 class。
因此相应地重构定义
public interface ICarInfo {
CarDetails GetCarInfo(string car);
}
public class CarDetails {
public string Color { get; set; }
public string MaxSpeed { get; set; }
public string Acceleration{ get; set; }
}
以及实施
public CarDetails GetCarInfo(string car) {
var client = new RestClient("http://xxx.xxxxxxx.com");
var request = new RestRequest("/{car} ? access_key =xxxxxxxxx", Method.GET);
var queryResult = client.Get<CarDetails>(request).Data;
return queryResult;
}
即使你坚持要保留ICarDetails
接口,你仍然需要一个反序列化的具体实现。
public interface ICarInfo {
ICarDetails GetCarInfo(string car);
}
public interface ICarDetails {
string Color { get; set; }
string MaxSpeed { get; set; }
string Acceleration{ get; set; }
}
public class CarDetails : ICarDetails {
public string Color { get; set; }
public string MaxSpeed { get; set; }
public string Acceleration{ get; set; }
}
再次确保使用混凝土 class
public ICarDetails GetCarInfo(string car) {
var client = new RestClient("http://xxx.xxxxxxx.com");
var request = new RestRequest("/{car} ? access_key =xxxxxxxxx", Method.GET);
var queryResult = client.Get<CarDetails>(request).Data;
return queryResult;
}
您不能使用此部分的界面。
在这种情况下,您想将接收到的值转换为一个不可能的接口。这是因为编译器需要一个类型来创建它的实例,然后将接收到的值转换为实例。它实际上需要一个带有无参数构造函数的 class 。您应该使用具体 class 而不是接口来解决问题。
我使用 restsharp 来消耗外部 API。 我有一个 class 扩展接口
public interface ICarInfo
{
ICarDetails GetCarInfo(string car);
}
public interface ICarDetails
{
string Color { get; set; }
string MaxSpeed { get; set; }
string Acceleration{ get; set; }
}
我创建了扩展此接口的 class 并使用 restsharp
实现了此方法public ICarDetails GetCarInfo(string car)
{
var client = new RestClient("http://xxx.xxxxxxx.com");
var request = new RestRequest("/{car} ? access_key =xxxxxxxxx", Method.GET);
var queryResult = client.Get<ICarDetails >(request).Data;
return queryResult;
}
现在我在这一行中收到错误:
var queryResult = client.Get<ICarDetails >(request).Data;
ICarDetails must be a non-abstract type with a public parameterless constructor in order to use it as a parameter T in the generic type or method
为了能够反序列化请求数据,需要一个具体的 class。
因此相应地重构定义
public interface ICarInfo {
CarDetails GetCarInfo(string car);
}
public class CarDetails {
public string Color { get; set; }
public string MaxSpeed { get; set; }
public string Acceleration{ get; set; }
}
以及实施
public CarDetails GetCarInfo(string car) {
var client = new RestClient("http://xxx.xxxxxxx.com");
var request = new RestRequest("/{car} ? access_key =xxxxxxxxx", Method.GET);
var queryResult = client.Get<CarDetails>(request).Data;
return queryResult;
}
即使你坚持要保留ICarDetails
接口,你仍然需要一个反序列化的具体实现。
public interface ICarInfo {
ICarDetails GetCarInfo(string car);
}
public interface ICarDetails {
string Color { get; set; }
string MaxSpeed { get; set; }
string Acceleration{ get; set; }
}
public class CarDetails : ICarDetails {
public string Color { get; set; }
public string MaxSpeed { get; set; }
public string Acceleration{ get; set; }
}
再次确保使用混凝土 class
public ICarDetails GetCarInfo(string car) {
var client = new RestClient("http://xxx.xxxxxxx.com");
var request = new RestRequest("/{car} ? access_key =xxxxxxxxx", Method.GET);
var queryResult = client.Get<CarDetails>(request).Data;
return queryResult;
}
您不能使用此部分的界面。 在这种情况下,您想将接收到的值转换为一个不可能的接口。这是因为编译器需要一个类型来创建它的实例,然后将接收到的值转换为实例。它实际上需要一个带有无参数构造函数的 class 。您应该使用具体 class 而不是接口来解决问题。