Используйте один реализованный интерфейс для создания экземпляра класса Generi c с несколькими интерфейсами. - PullRequest
0 голосов
/ 09 марта 2020

У меня есть универсальный c метод, который использует несколько интерфейсов,

public T GetZonePrices<T>() where T : IRegionalZonePrice, INationalZonePrice, new()
{
// codes here
}

Затем у меня есть класс, который будет использоваться для замены T. Он реализует только один интерфейс.

public class MarketRegionalZonePrice : IRegionalZonePrice
{
// properties here
}

Как использовать метод generi c, передавая класс, который реализовал только один из интерфейсов?

var result = GetZonePrices<MarketRegionalZonePrice>();

Это дает мне ошибку,

«Тип .. нельзя использовать в качестве типа параметра« T »в типе или методе generi c. Неявного преобразования ссылок из .. в .. не существует."

1 Ответ

0 голосов
/ 09 марта 2020

Как уже упоминалось в комментариях, вы не можете.

Что вы можете сделать, это:

public inteface IZonePrice 
{
// codes here
}
public interface IRegionalZonePrice : IZonePrice  
{
// codes here
}
public interface INationalZonePrice : IZonePrice 
{ 
// codes here
}

public T GetZonePrices<T>() where T :IZonePrice, new()
{
// codes here
}

Тогда это будет работать:

public class MarketRegionalZonePrice : IRegionalZonePrice
{
// properties here
}

...

var result = GetZonePrices<MarketRegionalZonePrice>()

при необходимости вы можете проверить тип T с помощью T is IRegionalZonePrice или T is INationalZonePrice

Много ли между этими интерфейсами различий? Потому что мне кажется, что вы слишком усложнили свою бизнес-модель / logi c?

Возможно, вам просто необходим интерфейс IZonePrice, и тогда ваша реализация будет public class RegionalZonePrice : IZonePrice и public class NationalZonePrice : IZonePrice с соответствующими различными значениями для каждой зоны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...