2016-07-28 15 views
2

スイッチ/ケースコードをリファクタリングする方法はありますか?JTokenTypeに基づいたJTokenのキャストを簡略化する方法

  • property.ValueJToken
  • opportunityある

    Type target = property.Value.Type.GetType(); 
    opportunity[property.Key] = property.Value.Value<target>(); 
    
    (それが許容できるC#のではありません)私は成功せずにアプローチを以下で試してみた(辞書に似て)CRM Dynamicsのエンティティ

です


ここに私が試しているコードですmplify。 (JTokenType.Object及びJTokenType.Arrayは異なる方法で処理されている)

   switch (property.Value.Type) 
       { 
        case JTokenType.Boolean: 
         opportunity[property.Key] = property.Value.Value<bool>(); 
         break; 
        case JTokenType.Date: 
         opportunity[property.Key] = property.Value.Value<DateTime>(); 
         break; 
        case JTokenType.Integer: 
         opportunity[property.Key] = property.Value.Value<int>(); 
         break; 
        case JTokenType.String: 
         opportunity[property.Key] = property.Value.Value<string>(); 
         break; 
        case JTokenType.Guid: 
         opportunity[property.Key] = property.Value.Value<Guid>(); 
         break; 
       } 

@diiN_によって示唆されるように、私はまた、この試み:

opportunity[property.Key] = property.Value.Value<dynamic>(); 

それはInvalidDataContractExceptionをスロー: visual studio exception

+0

「動的」にキャスティングするとどうなるでしょう: 'opportunity [property.Key] = property.Value.Value ();'? –

+0

残念ながら、それはCRM Dynamicsによって予想されるタイプに正しくキャスティングされていません。あなたの提案で質問を更新する – camous

答えて

2

switch文の代わりにこれを試すことができます:

if (property.Value is JValue) 
{ 
    opportunity[property.Key] = ((JValue)property.Value).Value; 
} 
+0

素晴らしい解決策とそれを見つけることが悲しい。文化のために私の特定の例(CRM Dynamics)では、Integer型の振る舞いをオーバーライドする必要がありました。なぜなら、json.netはデフォルトでいくつかの特定のフィールドに対してInt32ではなくInt64にキャストするからです。 – camous

0

あなたの状況に役立つかどうかはわかりませんが、同様のコードを使用しています。多分それを試してみてください。

// prepare return object 
returnResult.Value = new Dictionary<string, string>(); 

// discover data type 
Newtonsoft.Json.Linq.JTokenType parseAs = values[prop].Type; 

// parse the data and push it as string into the dictionary 
if (parseAs == Newtonsoft.Json.Linq.JTokenType.String) 
{ 
    returnResult.Value.Add(prop, (string)values[prop].Value); 
}       
else if (parseAs == Newtonsoft.Json.Linq.JTokenType.Integer) 
{ 
    returnResult.Value.Add(prop, ((Int16)values[prop].Value).ToString()); 
} 
else if (parseAs == Newtonsoft.Json.Linq.JTokenType.Boolean) 
{ 
    returnResult.Value.Add(prop, ((Boolean)values[prop].Value).ToString()); 
} 
else if (parseAs == Newtonsoft.Json.Linq.JTokenType.Array) 
{ 
    // in case of an array, when value is received by the corresponding method 
    // the way of deserializing and parsing will be decided then 
    returnResult.Value.Add(prop, values[prop].ToString()); 
} 
関連する問題