28

mono で .NET 2 を使用して、JSONネストされた文字列、オブジェクト ディクショナリ、およびリストを返す基本的なライブラリを使用しています。

これを既に持っているjsonDataクラスにマップするマッパーを書いています.anの基になる型がobjectディクショナリかリストかを判断できるようにする必要があります。以下は、このテストを実行するために使用している方法ですが、よりクリーンな方法があるかどうか疑問に思っていましたか?

private static bool IsDictionary(object o) {
    try {
        Dictionary<string, object> dict = (Dictionary<string, object>)o;
        return true;
    } catch {
        return false;
    }
}

private static bool IsList(object o) {
    try {
        List<object> list = (List<object>)o;
        return true;
    } catch {
        return false;
    }
}

私が使用しているライブラリはありますlitJsonが、JsonMapperクラスは基本的に iOS では機能しないため、独自のマッパーを作成しています。

4

4 に答える 4

65

isキーワードとリフレクションを使用します。

public bool IsList(object o)
{
    if(o == null) return false;
    return o is IList &&
           o.GetType().IsGenericType &&
           o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>));
}

public bool IsDictionary(object o)
{
    if(o == null) return false;
    return o is IDictionary &&
           o.GetType().IsGenericType &&
           o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(Dictionary<,>));
}
于 2013-06-19T11:39:20.243 に答える
7

特定のオブジェクトが何らかのタイプであることを確認したい場合は、is演算子を使用します。例えば:

private static bool IsDictionary(object o)
{
    return o is Dictionary<string, object>;
}

この単純なものでは、おそらく別のメソッドは必要ありませんが、必要なis場所で直接演算子を使用するだけです。

于 2013-06-19T11:59:51.350 に答える
3

上記の回答を変更します。使用GetGenericTypeDefinition()するには、メソッドの前にGetType(). MSDN を見ると、次のようGetGenericTypeDefinition()にアクセスさ れます。

public virtual Type GetGenericTypeDefinition()

リンクは次のとおりです: https://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition(v=vs.110).aspx

public bool IsList(object o)
{
    return o is IList &&
       o.GetType().IsGenericType &&
       o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>));
}

public bool IsDictionary(object o)
{
    return o is IDictionary &&
       o.GetType().IsGenericType &&
       o.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(Dictionary<>));
}
于 2015-03-02T13:31:52.913 に答える