2010-11-24 2 views
2

Я пытаюсь обобщить мой «последний» метод расширения для использования со списком любого типа данных:Обобщая метод расширения для работы с любым типом

public static CartesianPoint Last(this List<CartesianPoint> MyList) 
{ 
    return MyList.ElementAt(MyList.Count - 1); 
} 

«CartesionPoint» обычай структура. Я хотел бы, чтобы эта функция работала со списком любого типа данных. Это возможно? Использует ли «объект» единственный способ?

ответ

3

Последнее поддерживает выраженное выражение Linq, но если вы хотите написать общий метод расширения, это синтаксис, который вы ищете: Поместите общий <T> на объявление метода, а не на класс.

public static T Last<T>(this List<T> MyList) 
    { 
     return MyList[MyList.Count - 1]; 
    } 
7

Последнее уже поддерживается удлинителем Linq. Вы можете использовать его с любым IEnumerable.

+0

+1 См: http://msdn.microsoft.com/en-us /library/bb358775.aspx – 2010-11-24 07:37:45

+0

+1, но вы должны предоставить быстрый пример кода, поскольку OP явно не знаком с объектом. – 2010-11-24 08:32:58

0

В случае, если это было более общий вопрос, не особенно о Last():

Пока компилятор может определить, какой тип используется, вы можете иметь общие параметры типа на вашем метод. Когда он не может их вывести, вам придется указать их сами. (См методы Enumerable.OfType или Cast для деталей)

Вот абстрактный пример, пытаясь показать, что это возможно:

public static TResult Sample<TItem, TResult>(this IEnumerable<TItem> items, Func<TItem, TResult> gimmeThatValue) 
{ 
    var firstItem = items.First(); 
    return gimmeThatValue(firstItem); 
} 

var items = new []{new{Value1 = 1, Value2 = "Abc"}}; 
int value1 = items.Sample(i => i.Value1); 
String value2 = items.Sample(i => i.Value2.Substring(2, 1)); 
Смежные вопросы