QA@IT

objectからTypeを利用してListにキャストするのは?

27007 PV

こんにちは。お世話になります。
テンプレート引数が分からないList<T>がobjectにキャストされていたとしまして、
とりあえずList<object>しておこうとしたところ例外が発生してしまいました。
AのTypeは分かっているものとして、List<type>みたいなことが理想なのですが、
objectからtypeを利用してList<A>に再びキャストすることは可能でしょうか?

class A
{
    public int m_nA = 1 ;
}

class Program
{
    static void Main(string[] args)
    {
        List<A>    a = new List<A>() ;

        object  b = (object)a ;
        List<object>    c = (List<object>)b ;    // 例外発生。
    }
}

回答

class A
{
    public int m_nA = 1 ;
}

class Program
{
    static void Main(string[] args)
    {
        List<A> a = new List<A>();

        object[] b = a.ToArray();
        List<object> c = b.ToList(); 
    }
}

多分これが一番簡単だと思います。

編集 履歴 (0)
  • ご返答ありがとうございます。
    全く気がつきませんでした。
    この方法も利用してみます!
    -

度々ありがとうございます。
申し訳ありません、簡潔にと思って書いたつもりでした。
やりたいことというのはいろいろありますが、提示していただいた内容とほぼ変わりません。

ジェネリックと非ジェネリックが分からなくていろいろ調べています。
とりあえず、提示していただいたコードをそのままビルドしようとすると、

IList c = (IList)b;

の部分が「エラー CS0305: ジェネリック 型 'System.Collections.Generic.IList' の使用には、'1' 型の引数が必要です。」と、出ます。

申し訳ありません、上記の部分をビルドが通るようにするにはどのようにすればよいのでしょうか?

編集 履歴 (0)
  • `System.Collections.Generic.IList` ではなく `System.Collections.IList` である必要があります。
    なので `using System.Collections;` を追加するか、`System.Collections.IList` と完全修飾名で指定してみてください。
    -
  • 返答が遅れて申し訳ありません。
    System.Collections.IList
    で無事取得できました。
    ありがとうございました!
    -

どういうことがやりないのかがパッと判りませんでしたが、こういうことでしょうか?

using System;
using System.Collections;
using System.Collections.Generic;

class A
{
    public int m_nA = 1;
}

class Program
{
    static void Main(string[] args)
    {
        List<A> a = new List<A>() { new A() };

        object b = (object)a;

        // List<object>    c = (List<object>)b ;    // 例外発生。
        IList c = (IList)b;

        foreach (object o in c)
        {
            Console.WriteLine(o.GetType().Name); // -> A
        }
    }
}

List<object> ではなく、List<A> がインプリメントしている非ジェネリックなインタフェースにキャストすればいいと思います(IList とか ICollection とか IEnumerable とか)。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。