4

元のリスト内のオブジェクトの型が であることを知って、List<Object>指定されたオブジェクト型のリストにキャストされた元のリストを受け取り、返す関数を書きたいと思います。トリックは、リフレクションを使用して見つけた任意のタイプである可能性があるということです。コードがなくて申し訳ありませんが、これを行う方法を理解できませんでした。List<ObjectType>ObjectTypeObjectType

4

1 に答える 1

10

リスト内の各項目のタイプが であることがわかっている場合は、次のObjectTypeようにすることができます。

List<object> sourceList = new List<object>() { 1, 2, 3 };
List<int> resultList = sourceList.Cast<int>().ToList();

リスト内の各項目を一般的な方法で実際に変換したい場合、最も簡単な方法は次のようにすることです。

public static IEnumerable<T> ConvertTo<T>(this IEnumerable items)
{
    return items.Cast<object>().Select(x => (T)Convert.ChangeType(x, typeof(T)));
}

これは拡張メソッドとして実装されるため、次のように記述できます。

List<object> sourceList = new List<object>() { 1, 2, 3 };
List<string> resultList = sourceList.ConvertTo<string>().ToList();

コンパイル時にターゲットの型がわからない場合は、実際にリフレクションを使用する必要があります。次のようなものが機能します。

class ListUtil
{
    public static List<T> ConvertToList<T>(this IEnumerable items)
    {
        // see method above
        return items.ConvertTo<T>().ToList();
    }

    public static IList ConvertToList(this IEnumerable items, Type targetType)
    {
        var method = typeof(ListUtil).GetMethod(
            "ConvertToList", 
            new[] { typeof(IEnumerable) });
        var generic = method.MakeGenericMethod(targetType);
        return (IList)generic.Invoke(null, new[] { items });
    }
}

そして今、あなたはそれを次のように呼び出すことができます:

List<object> sourceList = new List<object>() { 1, 2, 3 };
IList resultList = ListUtil.ConvertToList(sourceList, typeof(string));
resultList.GetType(); // List<string>

もちろん、この方法ではコンパイル時の型の安全性が失われます。

于 2013-07-20T05:20:03.507 に答える