Я пытаюсь создать универсальный интерфейс, где тип параметра одного из методов определяется родовымC# Общий интерфейс и Factory Pattern
EDIT
Я изменил вопрос немного после того, как понимая, что я, вероятно, путал вопросы, указав параметр типа в методе создания фабрики. У меня есть два типа API-вызовов, которые мне нужно сделать для стороннего API. Первый извлекает запись из API с использованием идентификатора, который является int. Второй также извлекает запись из API, но Id - строка (guid). У меня есть класс для каждого типа записи (ClientEntity и InvoiceEntity), что и реализовать общий интерфейс, где я прохожу в типе Id
Это интерфейс, в котором я объявляю метод с идентификатором параметра
public interface IGeneric<TId>
{
void ProcessEntity(TId id);
}
Я реализую интерфейс в нескольких классах, один устанавливает id как int, а другой - в строку.
public class ClientEntity: IGeneric<int> // Record with Id that is an int
{
public void ProcessEntity(int id)
{
Console.WriteLine(id);
// call 3rd party API with int Id
}
}
public class InvoiceEntity: IGeneric<string> // Record with Id that is a string (guid)
{
public void ProcessEntity(string id)
{
Console.WriteLine(id);
// call 3rd party API with string Id
}
}
Что я хотел бы знать, как это использовать в рамках заводского шаблона?
public static class GenericFactory
{
public static IGeneric<WhatGoesHere> CreateGeneric(string recordType)
{
if (recordType == "Client")
{
return new ClientEntity();
}
if (type == "Invoice")
{
return new InvoiceEntity();
}
return null;
}
}
Цель состоит в том, чтобы использовать завод, чтобы создать экземпляр правильный класс, так что я могу вызвать метод ProcessEntity
EDIT
Я не хочу, чтобы пройти в Generic введите фабричный метод, потому что класс, созданный фабрикой, должен это обработать. Когда я создаю объект, я не знаю, какой тип идентификатора требуется, я хочу, чтобы фабрика обрабатывала это значение
например.
var myGeneric = GenericFactory.CreateGeneric("Client");
myGeneric.ProcessEntity("guid")
или
var myGeneric = GenericFactory.CreateGeneric("Invoice");
myGeneric.ProcessEntity(1234)
Я надеюсь, что имеет смысл
кажется запутанным, что ваш интерфейс имеет свойство 'Id' _AND_ метод, который принимает' Id' в качестве параметра. Вы уверены, что это то, что вы хотите делать? Если это так, вы должны четко указать, какая разница между этими двумя значениями. – Rik
Вы, вероятно, может игнорировать свойство, он просто хотел показать использование T –
типа возвращаемого из предложенного вами завода должен быть 'object', который вряд ли будет много пользы для вас ... если вы не используете' dynamic, но я бы посоветовал это сделать ... –