我可以使用反射来缩短此代码吗?

时间:2017-05-25 18:18:43

标签: c# json

我有一些代码,我觉得我应该能够令人难以置信地缩短,但我无法弄明白该怎么做。

我有一个名为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;
}

有什么方法可以用更简单的东西替换这个大案例陈述吗?

提前致谢 约翰劳里

2 个答案:

答案 0 :(得分:1)

仅使用反射,您可以执行以下操作:

Message

它检索您已定义GOARCH="amd64" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/Bryan/go" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" GO15VENDOREXPERIMENT="1" CC="clang" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common" CXX="clang++" CGO_ENABLED="1" 类的total 24 drwxr-xr-x 6 Bryan staff 204 May 23 12:13 . drwxr-xr-x+ 73 Bryan staff 2482 May 25 11:20 .. -rw-r--r--@ 1 Bryan staff 8196 May 24 15:11 .DS_Store drwxr-xr-x 32 Bryan staff 1088 Mar 28 14:21 bin drwxr-xr-x 3 Bryan staff 102 Mar 28 14:21 pkg drwxr-xr-x 10 Bryan staff 340 May 25 11:18 src ,然后在此程序集中搜索请求的类型。

答案 1 :(得分: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);