Как вернуть правильный конвертер?C#

Место общения программистов C#
Ответить
Anonymous
 Как вернуть правильный конвертер?

Сообщение Anonymous »

Фабрика конвертеров не может определить, какой конвертер использовать?
В настоящее время я работаю над конвертером для преобразования компонентов из одной системы CMS в другую систему CMS. .
Компоненты в старых cms имеют общий базовый класс с указанием имени компонента, которое также используется в качестве дифференциатора для различных реализаций этого базового класса.
например:

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

public abstract class ComponentBase
{
public string? ComponentName { get; set; }
}

public class RichTextElement : ComponentBase
{
public required string Title { get; set; }
public required string Content { get; set; }
}
Все созданные мной конвертеры наследуют BaseConverter, который включает в себя шаблон того, как, по моему мнению, должен быть реализован конвертер:

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

public abstract class BaseConverter
{
protected readonly ConverterTools _converterTools; ´

protected BaseConverter(ConverterTools converterTools)
{
_converterTools = converterTools;
}

public abstract BlokComponent ConvertComponent(T component);
public virtual IEnumerable ConvertComponents(List components)
{
return components.Select(ConvertComponent);
}
}
То есть конкретная реализация конвертера может выглядеть так:

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

public class RichTextElementConverter : BaseConverter
{
public RichTextElementConverter(ConverterTools converterTools) : base(converterTools)
{
}

private BlokTextComponent CreateText(string? title, string text)
{
var textComponent = new TextComponent()
{
Uuid = Guid.NewGuid(),
Component = "text-v1",
Title = title ?? string.Empty,
Text = text),
};

return textComponent;

}

public override BlokComponent ConvertComponent(RichTextElement component)
{
return CreateText(component.Title, component.Content);
}
}
Теперь мне нужен способ определить, какой конвертер мне следует использовать, какая-то фабрика, которая сможет создать нужный мне конвертер.
Я попробовал с это пока - но, кажется, возникают проблемы с BaseConverter, который слишком общий и должен быть конкретным?
Я не понимаю.

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

public class ConverterFactory
{
private readonly ConverterTools _converterTools;
private readonly Dictionary _converters;

public ConverterFactory(ConverterTools converterTools)
{
_converterTools = converterTools;
_converters = new Dictionary
{
{ typeof(RichTextElement), context => new RichTextElementConverter(_converterTools) },
};
}

public BaseConverter? GetConverter()
{
if (_converters.TryGetValue(typeof(T), out var converterFactory))
{
return converterFactory(_converterTools) as BaseConverter;
}

return null;
}
}
Как позволить моей фабрике возвращать правильный компонент сопоставителя, учитывая имя компонента, указанное в ComponentBase.
Поэтому я ограничил базовый преобразователь чтобы он смотрел ComponentBase.
У меня все еще есть проблемы с фабрикой, возвращающей правильный преобразователь.
Все записи моего словаря показывают эту ошибку:

Невозможно преобразовать Converters.RichTextElementConverter в Converters.BaseConverter


Подробнее здесь: https://stackoverflow.com/questions/791 ... -converter
Ответить

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

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

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

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

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