调用外部 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 而不是接口来解决问题。