5

次のシグネチャを持つ並べ替え拡張メソッドがあります。

public static IEnumerable<T> CustomSort<T>(this IEnumerable<T> source, string sortProperties)

しばらく前にそれを書きましたが、それはその役割を果たしています。現在、カスタム コントロールを作成しており、DataSource プロパティは IEnumerable (非ジェネリック) です。非ジェネリック IEnumerable でオブジェクトの型を取得する方法はありますか?

「カスタム コントロールのデータ ソースを並べ替える」という問題は 100 万回解決されたと確信していますが、解決策を見つけることができないようです。

4

3 に答える 3

5

ここには、型が同時に複数の T に対して IEnumerable-of-T を実装できるという根本的な問題があります。しかし、そのケースを除外すると、生意気なアプローチは次のようになります。

void Evil<T>(IEnumerable<T> data) {...}

IEnumerable source = ...
dynamic cheeky = source;
Evil(cheeky);

これにより、基本的にこの問題が DLR にオフロードされ、Evil-of-T メソッドが簡単になります。

于 2012-12-02T09:37:42.673 に答える
1

個人的には、私はちょうど使用します

DataSource.Cast<object>()

そして、関数IEnumerable<object>で使用できる がありますCustomSort<T>。ここでは、この関数がすでに任意のオブジェクトを処理できると想定しています。2 番目のパラメーター名から判断すると、いずれにせよリフレクションを使用していると推測されるので、問題ないはずです。GetType()反映するときに各オブジェクトを使用していることを確認してください。実際のオブジェクトのフィールドのリストは取得されませんtypeof(T)typeof(T)object

もちろん、コンパイル時にデータ ソース内のすべてのオブジェクトの型が実際にわかっている場合は、代わりにその型を使用することもできます。たとえば、次のようになります。

DataSource.Cast<Customer>()
于 2012-12-02T09:08:41.863 に答える
1

実行時に正しい型を返す拡張メソッドを作成できます。

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});
    }

}
于 2012-12-02T10:04:53.850 に答える