Как преобразовать полученный класс в базовый абстрактный общий класс при возврате из функции?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как преобразовать полученный класс в базовый абстрактный общий класс при возврате из функции?

Сообщение Anonymous »

Я работаю над приложением, в котором мне нужно извлечь данные из разных систем с разными типами соединений, получает некоторые данные из каждого из них, затем возвращаю их в согласованном формате.
Я определил базовый Dataconnection type:

Код: Выделить всё

public abstract class DataConnection
{
public Guid Id { get; set; }
public string Type { get; set; }
}
< /code>
, который будет использоваться в качестве базы для различных видов соединений данных, например: < /p>
public class HttpDataConnection : DataConnection
{
public Uri Url { get; set; }
}
Я также определил класс DataClient , который должен быть в состоянии извлекать данные из исходной системы последовательным способом.

Код: Выделить всё

public abstract class DataClient
where T : DataConnection
{
T Connection { get; set; }
Task GetDataEntriesAsync(CancellationToken token = default);
}
< /code>
Это будет расширено для создания клиентов, специфичных для типа соединения: < /p>
public class HttpDataClient : DataClient
{
public async Task GetDataEntriesAsync(CancellationToken token = default)
{
// Make HTTP request to fetch data here
}
}
< /code>
Я хотел бы создать единую точку входа, чтобы принести правильный тип клиента на основе данного соединения для передачи данных, аналогично этим: < /p>
public static class DataClientGenerator
{
public static DataClient GenerateClientFromConnection(T connection)
where T : DataConnection
{
if (connection is HttpDataConnection httpDataConnection)
{
return new HttpDataClient(connection); // Line causing issue
}
else if (connection is SomeFutureDataClientType otherType)
{
return new SomeFutureDataClientType(connection); // Will also cause an issue
}

throw new Exception("Unable to create DataClient");
}
}
< /code>
, который позволит использовать его так: < /p>
public async Task GetDataFromConnection(
T connection,
CancellationToken token = default
)
where T : DataConnection
{
DataClient client = DataClientGenerator.GenerateClientFromConnection(connection);
return await client.GetDataEntriesAsync(token);
}
< /code>
Однако класс DataClientGenerator < /code> имеет ошибку компилятора при возвращении сгенерированного клиента: < /p>

не может преобразовать тип выражения 'httpdataclient', чтобы вернуть тип 'DataClient' < /p>
< /blockquote>  warding this a with this wableting '< /p>
Httpdataclient 
класс получен из DataClient , который является типом t в этом случае.
Как я могу изменить структуру класса, чтобы сделать это? соединение, которое необходимо для доступа к источнику данных.

Подробнее здесь: https://stackoverflow.com/questions/797 ... eturned-fr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»