Создание экземпляров абстрактных классов или интерфейсов в С#C#

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

Сообщение Anonymous »

Проблема
Я пытаюсь создать метод для прослушивания потока с сервера Redis и возврата списка записей потока в зависимости от текущего типа потока. Для этого я создал простой абстрактный базовый класс со свойствами, которые я ожидаю от всех типов потоковых записей

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

public abstract class RedisStreamEntryDto
{
public required float Progress { get; set; }
public required bool RunDone { get; set; }
}
Класс для прослушивания потока будет выглядеть примерно так, как следующий код, который уже иллюстрирует проблему:

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

public class RedisUtils(ConnectionMultiplexer redis)
{

public async Task GetStreamEntriesAsync(string streamName):
{

var db = redis.GetDatabase();

bool stopListening = false;
List streamItems = [];

while (!stopListening)
{
StreamEntry[] streamEntries = await db.StreamReadAsync(streamName, "0-0");

foreach (var entry in streamEntries)
{
if(entry.IsNull)
{
continue;
}

var add_entry = // how to instantiate?

streamItems.Add(add_entry);

if (add_entry.RunDone)
{
stopListening = true;
break;
}
}

}
return streamItems;
}
}
Обычно я бы справился с этим, передав JSONS и вызвав JsonSerializer.Deserialize(entry), но полученные значения являются типами RedisValue и не имеют встроенная десериализация, или, скорее, мне сначала пришлось бы создать строку JSON, которая кажется хакерской.
Подход
Идея заключалась в том, чтобы просто заставить все классы, которые наследуются от RedisStreamEntryDto, реализовать статический метод FromStreamEntry(StreamEntry write), который возвращает правильный экземпляр. Я застрял в том, как реализовать это в базовом классе, чтобы иметь возможность его использовать. Абстрактные статические методы невозможны, я также уже пытался использовать интерфейс вместо абстрактного класса, но это в основном приводит к той же проблеме.
Единственное решение, которое я могу придумать, - это создать отдельный фабричный класс , что немного раздражает в этой «простой» проблеме. Неужели нет лучшего решения?

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

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

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

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

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

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

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