我可以使用反射缩短此代码吗?
问题描述:
我有一些代码,我觉得我应该能够缩短难以置信的,但我不知道如何去做。我可以使用反射缩短此代码吗?
我有一个名为消息的基类,并可能从它派生的类。
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;
}
有没有什么办法可以用简单的东西来代替这个庞大的案例陈述?
在此先感谢 约翰·劳瑞
答
仅使用反射,您可以:
string messageName = "ModalVR.GetBatteryInfo";
Type messageType = Assembly.GetAssembly(typeof(Message)).GetType(messageName);
Message derivedMessage = (Message)JsonUtility.FromJson(json, messageType);
它检索已定义Message
类的Assembly
,然后在此程序集中搜索请求的类型。
+0
这正是我所需要的。这是最好的解决方案,因为它处理添加更多消息而不需要任何附加代码。谢谢 – Dalanchoo
答
最简单的方法是创建一个这样的解释:
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);
这可能会有帮助。 https://*.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity – hatchet
这真的好像虚拟功能的情况。您正在切换类型,以便仅在刚刚打开的类型中执行一些不同的操作。 –