概括扩展方法以使用任何类型

时间:2010-11-24 07:29:06

标签: c#

我试图概括我的“Last”扩展方法,以便与任何数据类型的列表一起使用:

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

“CartesionPoint”是一个自定义结构。我希望此函数可以处理任何数据类型的列表。这可能吗?使用'对象'是唯一的方法吗?

3 个答案:

答案 0 :(得分:7)

Last已经是受支持的Linq扩展。您可以将它与任何IEnumerable一起使用。

答案 1 :(得分:3)

Last是受支持的Linq表达式,但如果您确实想编写泛型扩展方法,那么这就是您要查找的语法:将泛型<T>放在方法声明上,而不是放在类上。

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

答案 2 :(得分: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));