Хорошо.Самое близкое, что я мог получить, было это:
class Program
{
static void Main(string[] args)
{
List<long> ids = new List<long> { 1, 2, 3 };
//Non generic way
List<Data> dataItems = ids.ConvertToDataItems();
//Generic attempt!!
Func<long, Data> selector = (p => new Data { DataId = p });
List<Data> differntDataItems = ids.ConvertToEntities<Data>(selector);
}
}
public class Data
{
public long DataId;
public string Name;
}
public static class ExtensionMethods
{
public static List<Data> ConvertToDataItems(this List<long> dataIds)
{
return dataIds.Select(p => new Data { DataId = p }).ToList();
}
public static List<TProp> ConvertToEntities<TProp>(this List<long> entities, Func<long, TProp> selector)
{
return entities.Select(selector).ToList();
}
}
Это работает.
У меня такое чувство, что вы немного запутались с тем, что вы на самом деле хотите в качестве возвращаемого типа.Было бы круто иметь возможность указать, что мы хотим в вызове метода или что-то в этом роде.Например:
public static List<TProp> ConvertToEntities<T, TProp>(List<T> entities, Func<T, TProp> selector)
{
return entities.Select(selector).ToList();
}
Это обеспечивает нам большую гибкость в отношении типа возвращаемого значения.Но так как мы делаем это с использованием расширений, я предполагаю, что это нецелесообразно, потому что нам нужно знать, какой тип мы расширяем:
РЕДАКТИРОВАТЬ Исправлено предложение кода.