Реализовать различные типы возвращаемых данных из интерфейса с использованием обобщений - PullRequest
0 голосов
/ 26 марта 2020

У меня есть интерфейс, определенный следующим образом:

public interface ISomeOrderService
{
    T GetUserNameandPass<T>();
    Task<IEnumerable<T>> FetchOrdersAsync<T>(bool useProxy, bool impersonateProxyUser);
}

Для GetUserNameandPass я хочу, чтобы он возвращал следующий объект в реализующем классе:

public class NameandPass
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

На с другой стороны, для FetchOrdersAsync я хочу, чтобы он возвращал следующий объект в реализующем классе:

public class SomeOrder
{
    public string prop1 { get; set; }
    public DateTime prop2 { get; set; }
    internal static async Task<IEnumerable<SomeOrder>> ConvertServiceResponseToSomeOrderListAsync(SomeResponse someResponse)
    {
        //someResult
        return someResult.ToList();
    }
}

У меня есть реализующий класс, который выглядит следующим образом:

public class SomeOrderService : ISomeOrderService
{
    private IAMSService _aMSService;
    public SomeOrderService()
    {
        _aMSService = new AMSService();
    }
    public NameandPass GetUserNameandPass()
    {
        return _aMSService.GetProxyUser<NameandPass>("SomeTypeOfUser");
    }
    public async Task<IEnumerable<SomeOrder>> FetchOrdersAsync<SomeOrder>(bool useProxy, bool impersonateProxyUser)
    {
        //someResponse;
        return await SomeOrder.ConvertServiceResponseToSomeOrderListAsync(someResponse);
    }
}

Здесь у меня есть эта первая ошибка в строке:

return await SomeOrder.ConvertServiceResponseToSomeOrderListAsync(someResponse);

SomeOrder is a type parameter, which is not valid in the given context.

А другая ошибка появляется в AMSService:

public class AMSService : IAMSService
{
    public NameandPass GetProxyUser<NameandPass>(string proxyUser)
    {
        //someProxyUserResultObject
        return new NameandPass { UserName = someProxyUserResultObject.Username, Password = someProxyUserResultObject.Password };
    }
}

Здесь я получаю эта вторая ошибка:

AMSService doesn't implement member 'IAMSService.GetProxyUser<T>(string)'. 'AMSService.GetProxyUser<NameandPass>(string)' cannot implement 'IAMSService.GetProxyUser<T>(string)' because it does not have matching return type of 'T'.'

IAMSService.cs выглядит так:

public interface IAMSService
{
    T GetProxyUser<T>(string proxyUser);
}

Что я могу здесь делать не так? Не подходит ли определение моего интерфейса с самого начала?

Спасибо за помощь!

...