Существует действительно чистый способ решить эту проблему;Вы можете использовать словарь с ключами типа данных и значениями, которые имеют тип общего Func <>.Затем вы передаете тип в свой метод create, который затем ищет Func <> для использования в Словаре на основе типа и вызывает Func <> для создания или обработки вашего объекта.
Так как яработая с псевдокодом, в основном это будет выглядеть примерно так:вы можете поиграть с ним и изменить его, чтобы он соответствовал вашим потребностям, но это основная идея.
Сначала создайте родительский класс для всех объектов данных;обратите внимание, что в этом классе есть словарь поиска для функций, которые можно вызывать для различных типов, и обратите внимание, что он абстрактный:
public abstract class Data
{
// A Lookup dictionary for processing methods
// Note this the functions just return something of type object; specialize as needed
private static readonly IDictionary<Type, Func<object, Data>> _processFunctions = new Dictionary
<Type, Func<object, Data>>()
{
{typeof(int), d => { return doSomethingForInt( (Data<int>) d); }},
{typeof(string), d => { return doSomethingForString( (Data<string>) d); }},
{typeof(double), d => { return doSomethingForDouble( (Data<double>) d); }},
};
// A field indicating the subtype; this will be used for lo
private readonly Type TypeOfThis;
protected Data(Type genericType)
{
TypeOfThis = genericType;
}
public Data Process()
{
return _processFunctions[this.TypeOfThis](this);
}
}
Теперь подкласс Data с универсальным типом, который может быть создан:
class Data<T> : Data
{
// Set the type on the parent class
public Data() : base(typeof(T))
{
}
// You can convert this to a collection, etc. as needed
public T Items { get; set; }
public static Data<T> CreateData<T>()
{
return new Data<T>();
}
}
Затем вы можете создать класс DataCollection, используя родительский тип.Обратите внимание на метод ProcessData ();все, что он делает сейчас, это циклически перебирает элементы и вызывает Process () для каждого:
class DataCollection
{
public IList<Data> List = new List<Data>();
public void ProcessData()
{
foreach (var d in List)
{
d.Process();
}
}
}
... и все готово!Теперь вы можете вызывать свою коллекцию данных с различными типами данных:
DataCollection dc = new DataCollection();
dc.List.Add(new Data<int>());
dc.List.Add(new Data<string>());
dc.List.Add(new Data<double>());
dc.ProcessData();