По сути, я ищу способ преобразования GenericList<TInput>
в GenericList<TOutput>
, где GenericList
- это общий список любого типа, который реализует определенный интерфейс, а типы TInput
и TOutput
известно только во время выполнения.
Ниже приведен фрагмент класса и метода, который может выполнять эту операцию, где TInput
и TOutput
предоставляются во время компиляции.
// --------------------------------------------------------------------------------
/// <summary>This class is an example snippet for transforming generic lists of different types.</summary>
///
/// <remarks></remarks>
// --------------------------------------------------------------------------------
public abstract class GenericListHelper<TInput, TOutput>
where TInput : IGenericObject, new()
where TOutput : IGenericObject, new()
{
// --------------------------------------------------------------------------------
/// <summary>This method takes in a generic list of an input type
/// and transforms it a list of the output type.</summary>
///
/// <param name="inputGenericList">The input list to transform to this list.</param>
/// <param name="filterElements">Field and property values to exclude from transform.</param>
// --------------------------------------------------------------------------------
public static GenericList<TOutput> CreateList(GenericList<TInput> inputGenericList, NameObjectCollection filterElements)
{
if (inputGenericList != null)
{
GenericList<TOutput> outputGenericList = new GenericList<TOutput>();
foreach (TInput loopItem in inputGenericList)
{
TOutput newItem = new TOutput();
DataTransformHelper.TransformDataFromObject(loopItem, newItem, filterElements);
outputGenericList.Add(newItem);
}
return outputGenericList;
}
return null;
}
}
Есть ли способ сделать что-то в этом духе, когда TInput
и TOutput
могут быть предоставлены во время выполнения?
Использование отражения в той или иной форме, кажется, путь к этому.
Изначально я попытался создать конструктор для GenericList<TInput>
, который бы принимал список типа TOutput
в качестве параметра (тогда я мог бы вызвать Activator.CreateInstance
, чтобы получить новый список).
В качестве альтернативы я попытался вызвать вышеупомянутый метод с помощью отражения, но так как этот метод помечен ContainsGenericParameters=true
и помечен как IsGenericMethod=false
, я не смог вызвать метод, либо через обычный method.Invoke
, либо через универсальный method.Invoke
(невозможно позвонить MakeGenericMethod
).