По сути, я ищу способ преобразования 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
).
Это C#? Как добавить тег C#? – sellibitze
Что вы на земле делаете? Что случилось с IList? –
mcintyre321
Я отмечен как C#. Не уверен, что вы подразумеваете под «что не так с IList. В моем случае элементы« GenericList »и« IGenericObject », которые они содержат, должны делать кучу других вещей для поддержки моих конкретных корпоративных требований. Скажем, например, у меня есть Клиенты и клиенты имеют заказы. В общей системе Domain A имеет клиентов, а заказы и домен B имеют клиентов и ордеров, в основном похожих, но не идентичных домену A. Хотите иметь возможность преобразовывать клиентов и их заказы между этими доменами и в каждом домене клиенты и заказы строго типизированы. –