3

オブジェクトがタイプであるかどうかを識別したいという問題がありますKeyValuePair<,>

次の場合に比較すると:

else if (item.GetType() == typeof(KeyValuePair<,>))
{
    var key = item.GetType().GetProperty("Key");
    var value = item.GetType().GetProperty("Value");
    var keyObj = key.GetValue(item, null);
    var valueObj = value.GetValue(item, null);
    ...
}

IsGenericTypeDefinition彼らにとっては異なるので、これは誤りです。

誰かが私にこれが起こっている理由とこの問題を正しい方法で解決する方法を説明できますか(私は名前や他の些細なフィールドを比較しないことを意味します)。

事前にTHX!

4

2 に答える 2

2
item.GetType() == typeof(KeyValuePair<,>)

上記は決して機能しません:タイプのオブジェクトを作成することは不可能KeyValuePair<,>です。

その理由はtypeof(KeyValuePair<,>)、タイプを表していないためです。むしろ、これはジェネリック型の定義です。他のジェネリック型の構造を調べるために使用されるSystem.Typeオブジェクトですが、それ自体は有効な.NET型を表すものではありません。

itemが、たとえば、の場合KeyValuePair<string,int>item.GetGenericTypeDefintion() == typeof(KeyValuePair<,>)

コードを変更する方法は次のとおりです。

...
else if (item.IsGenericType() && item.GetGenericTypeDefintion() == typeof(KeyValuePair<,>)) {
    ...
}
于 2012-12-28T15:06:39.163 に答える
2

このコードを見つけたら、試してみてください。

public bool IsKeyValuePair(object o) 
{
    Type type = o.GetType();

    if (type.IsGenericType)
    {
        return type.GetGenericTypeDefinition() != null ? type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>) : false;
    }

    return false;
}

ソース:

http://social.msdn.microsoft.com/Forums/hu-HU/csharpgeneral/thread/9ad76a19-ed9c-4a02-be6b-95870af0e10b

于 2012-12-28T15:00:00.410 に答える