7

リフレクションを使用して .NET オブジェクトを検査し、それらをログにダンプしています。

問題が発生しました - プロパティが配列型の場合はどうなりますか? そのプロパティの構造を取得しPropertyInfoます。プロパティが配列であることがわかり、その配列プロパティの値を取得することもできます。

if(propertyInfo.PropertyType.IsArray)
{
    var value = propertyInfo.GetValue(myObject, null);
}

しかし今、私は立ち往生しています。Visual Studio デバッガーを見ると、int[3]VS は 3 つの整数の配列であることを認識していますが、これをこれらの 3 つの整数を表すコンマ区切りの文字列に変換するにはどうすればよいでしょうか?

私は次のようなことを試しました

string.Join(", ", value);

など-しかし、私は常にそれvalueが「動的」であるという事実に苦労しています。たとえば、 aint[]または adecimal[]または他の何かである可能性があります。奇妙な結果がstring.Join()返されます(間違いなく、私が探しているものではありません...)

この「何かの配列」を多くのif(...)andelse { .... }節なしでコンマ区切りの文字列に変換する賢い方法はありますか??

どういうわけか私は今ここで脳がフリーズしています - このフリーズを解凍するためのアイデアは大歓迎です!

4

2 に答える 2

8

この問題を回避する最も簡単な方法は、IEnumerable<object>. このような:

if(propertyInfo.PropertyType.IsArray)
{
    var values = (IEnumerable)propertyInfo.GetValue(myObject, null);
    var stringValue = string.Join(", ", values.OfType<object>());
}

ただし、 c#の配列共分散のため、が参照型valuesの配列である場合、 にキャスト可能である必要があります。この場合、代わりにこれを使用できます。object[]

if(propertyInfo.PropertyType.IsArray)
{
    var values = (IEnumerable)propertyInfo.GetValue(myObject, null);
    var elementType = propertyInfo.PropertyType.GetElementType();
    if (elementType != null && !elementType.IsValueType)
    {
        var stringValue = string.Join(", ", (object[])values);
    }
    else
    {
        var stringValue = string.Join(", ", values.OfType<object>());
    }
}
于 2013-04-02T06:27:57.903 に答える
2

これは、配列を含むすべてのタイプのコレクションで機能する最も単純なソリューションです (これは、考えられるIEnumerable最も一般的なベースではありません)。

string.Join(", ", ((IEnumerable)value).Cast<object>().Select(i => i.ToString()));

于 2013-04-02T06:28:18.650 に答える