我正在构建一个c#。.NET 4.5)通用的"电报"——因为找不到更好的词了——在plc和普通pc之间使用tcp和JSON(尤其是JSON.NET)进行通信。我有一个tcp服务器设置和工作,我可以创建Json字符串的对象,然后可以传递。因此,我需要定义一种标准的方式来来回传递信息、命令和事件。我现在正在努力的是如何轻松地格式化"有效载荷"。我有一个JsonTelegram类,其中有一个动态变量称为"payload"-或多或少如下:
private dynamic _payload;
public dynamic payload
{
get
{
return _payload;
}
set
{
_payload = value;
updateContents();
}
}
如果我像这样更新这个变量:
myTelegram.payload = rampTime;
我希望看到最终的JSON是这样的:
{
"purpose": "Update this variable",
"payload": {
"rampTime": 2000
},
"timeStamp": "2000-01-01T00:00:00.000-00:00",
"returnID": "2000-01-01T00:00:00.000-00:00"
}
这是我真正挣扎的有效载荷部分,因为那里的代码最终看起来像这样:
{
"purpose": "Update this variable",
"payload": 2000,
"timeStamp": "2000-01-01T00:00:00.000-00:00",
"returnID": "2000-01-01T00:00:00.000-00:00"
}
当updateContents()使用this时:
... Newtonsoft.Json.JsonConvert.SerializeObject(_payload) ...
你看到"斜坡"这个词是如何被"有效载荷"取代的吗?我知道我可以创建一个方法,并传递对象和对象的名称——这肯定可以工作。但我想要更复杂一点,因为这应该是可能的,也因为我可以看到一些其他的原因,这种设计可能会更好地工作。我希望代码只知道调用它的变量的名称并使用它。我见过许多建议使用了一些我几乎不理解的东西,但是当我试着去适应它时,它似乎被一个或另一个问题所困扰。所以我想我应该问一个新的问题,因为肯定有很多人想用JSON和新的动态做同样的事情?
StackOverflow有关于属性和字典、反射、与t有关的东西、表达式等信息。例如,这个问题:如何获得在声明中物理键入的变量的名称?查找传递给函数的变量名
我不介意把类代码弄得乱七八糟,但我希望调用代码像"myTelegram"一样干净。payload = rampTime;"
很抱歉,我不能很好地阅读所有的建议-我花了大部分时间编写plc代码,现在才有一个plc,一边是c#。
还有,如果有一种更优雅、完全不同的做事方式,我很想听听。
谢谢!
听起来你在寻找一个ExpandoObject。使用ExpandoObject,您的电报看起来像:
class Telegram
{
private dynamic _payload = new ExpandoObject();
public dynamic payload
{
get
{
return _payload;
}
}
public string ToJson()
{
...
}
}
在你的代码中:
var telegram = new Telegram();
telegram.payload.rampTime = 2000;
Console.WriteLine(telegram.ToJson());