您可以創建一個擴展方法,將在運行時返回正確的類型:
public static class LinqExtensions
{
public static Type GetElementType(this IEnumerable source)
{
var enumerableType = source.GetType();
if (enumerableType.IsArray)
{
return enumerableType.GetElementType();
}
if (enumerableType.IsGenericType)
{
return enumerableType.GetGenericArguments().First();
}
return null;
}
}
更新:我補充說,我會用它來執行特定仿製IEnumerable<T>
排序的非機制通用IEnumerable
public static class SortingExtensions
{
public static IEnumerable<T> CustomSort<T>(this IEnumerable<T> source, string sortProperties)
{
// sort here
}
public static IEnumerable CustomSort(this IEnumerable source, string sortProperties)
{
var elementType = source.GetElementType();
var genericElementType = typeof (IEnumerable<>).MakeGenericType(elementType);
var sortMethod = typeof (SortingExtensions).GetMethod(
"CustomSort",
BindingFlags.Public | BindingFlags.Static,
null,
new [] {genericElementType, typeof (string)},
null);
return (IEnumerable) sortMethod.Invoke(null, new object[] {source, sortProperties});
}
}
有趣的方法。我也會試一試。關於排序方法,這或多或少是我們正在做的事情,但我們也考慮用多個屬性進行排序,每個屬性都有自己的方向。 –
我試過你的解決方案,但是enumerableType.GetGenericArguments()。First()導致StackOverflowException。 (沒有這些年齡之一!:)) –
我發現這個問題。一旦該方法通過公共靜態IEnumerable CustomSort(此IEnumerable源,字符串sortProperties),它會再次被調用,並且這會創建一個無限循環,或者看起來如此。 –