web-dev-qa-db-ja.com

配列へのC#オブジェクト

リフレクションを使用して、アイテムの反復可能なリストにキャストする必要があるオブジェクトがあります(タイプは不明、オブジェクトになります)。 [ウォッチ]ウィンドウを使用すると、オブジェクトの数がわかるため、オブジェクトが何らかのタイプの配列であり、ツリービューを展開して要素自体を表示できます。

最初に、渡されたオブジェクトが何らかの種類の配列(Listの場合もあり、object []の場合もあるなど)であることを確認する必要があります。次に、その配列を反復処理する必要があります。ただし、型の変換はできません。

使用方法(略称)は次のとおりです。

    private static void Example(object instance, PropertyInfo propInfo)
    {
        object anArray = propInfo.GetValue(instance, null);
        ArrayList myList = anArray as ArrayList;
        foreach (object element in myList)
        {
            // etc
        }
    }

さまざまなキャストを試しました。上記は例外を発生させませんが、anArrayが実際に存在し、アイテムを含む場合、mylistはnullです。保存される実際のインスタンスは厳密に型指定されたList <>ですが、必要に応じてフォームの限定されたサブセットを取ることができます。しかし、演習のポイントは、このExample()メソッドがプロパティの基本タイプを知らないことです。

23
GeoffM

ArrayListへのキャストは、オブジェクトが実際にis ArrayListである場合にのみ機能します。 System.ArrayやSystem.Collections.Generic.List`1などでは機能しません。

あなたが実際にすべきことは、それをIEnumerableにキャストすることだと思います、それはそれをループするためのあなたの唯一の要件だからです...

object anArray = propInfo.GetValue(instance, null);
IEnumerable enumerable = anArray as IEnumerable;
if (enumerable != null)
{
    foreach(object element in enumerable)
    {
        // etc...
    }
}
44
MattDavey

IEnumerableにキャストしてみてください。これは、すべての列挙型、配列、リストなどが実装する最も基本的なインターフェイスです。

IEnumerable myList = anArray as IEnumerable;
if (myList != null)
{
    foreach (object element in myList)
    {
        // ... do something
    }
}
else
{
    // it's not an array, list, ...
}
14
Daniel Hilgarth

単にこれを試してください

 string[] arr = ((IEnumerable)yourOjbect).Cast<object>()
                             .Select(x => x.ToString())
                             .ToArray();
5
Hardeep Singh

これを試して:

    var myList = anArray as IEnumerable;
    if (mylist != null)
    { 
        foreach (var element in myList)
        {
            // etc
        }
    }

状況に応じて、IEnumerableのジェネリック型を指定する必要がある場合もあります。

1
Rik

並べ替え(配列、リストなど)のコレクションである場合、IEnumerableにキャストできるはずです。また、PropertyInfoにはPropertyTypeプロパティが含まれています。このプロパティを使用して、必要に応じて実際の型を見つけることができます。

1
ChrisWue