2017-05-25 8 views
0

私は信じられないほど短くする必要があると感じるコードをいくつか持っていますが、それをどうやって行うのか分かりません。このコードを短縮するためにリフレクションを使用できますか?

私はMessageという基本クラスを持っており、そこから派生したクラスになります。

namespace ModalVR { 
    public class Message { 
     public string message; 

     public Message() { 
      this.message = this.ToString(); 
     } 
    } 
} 

サブクラスはJSONに変換され、このJSONを受け取る関数があり、適切なクラスを作成する必要があります。しかし、それを行う関数は大文字小文字のステートメントを持っており、私はこれを行うためのより良い方法がなければならないと感じています。これは、その関数の外観です。

public Message ConstructMessageFromJSON(string JSON) { 
    string messageName = JsonUtility.FromJson<Message>(JSON).message; 

    Message derivedMessage = null; 

    switch(messageName) { 
     case "ModalVR.GetBatteryInfo": { 
      derivedMessage = JsonUtility.FromJson<GetBatteryInfo>(JSON); 
      break; 
     } 

     case "ModalVR.GetBatteryInfoResponse": { 
      derivedMessage = JsonUtility.FromJson<GetBatteryInfoResponse>(JSON); 
      break; 
     } 

     // Many more case statements snipped out 

     default: { 
      LogManager.Log("Received unknown message of " + messageName, LogManager.LogLevel.Error); 
      break; 
     } 
    } 

    return derivedMessage; 
} 

この大文字のステートメントを簡単に置き換えることはできますか?事前 ジョン・ローリー

+0

これは参考になる場合があります。 https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity – hatchet

+0

これは本当に仮想関数の場合のようです。タイプを切り替えると、スイッチを入れたばかりのタイプでのみ異なるものが実行されます。 –

答えて

1

反射のみを使用すると、次の操作を実行できます。

string messageName = "ModalVR.GetBatteryInfo"; 
Type messageType = Assembly.GetAssembly(typeof(Message)).GetType(messageName); 
Message derivedMessage = (Message)JsonUtility.FromJson(json, messageType); 

クラスを定義したAssemblyを取得し、このアセンブリで要求された型を検索します。

+0

これは私が必要としていたものです。これは、追加のコードを必要とせずにさらに多くのメッセージを追加するため、最善の解決策です。ありがとう – Dalanchoo

0

おかげでそのような辞書を作成することです最も簡単な方法:

var typeMatches = new Dictionary<string, Type> 
    { 
     {"ModalVR.GetBatteryInfo", typeof(GetBatteryInfo)} 
    }; 

をして、それから値を取得:(それはC#7です)

if (!typeMatches.TryGetValue(messageName, out var messageType)) 
    { 
     LogManager.Log("Received unknown message of " + messageName, LogManager.LogLevel.Error); 
     return; 
    } 

    var derivedMessage = (Message) JsonUtility.FromJson(JSON, messageType); 
関連する問題