Telegram 机器人有一个代码。任务的本质是在接收到特定类型的消息(照片或视频)时,需要执行某种方法。
static string chatID = "***";
static string securePART = ":***";
int update_id = 0;
TelegramBotClient botClient = new TelegramBotClient(chatID + securePART);
string primaryUrl = @"https://api.telegram.org/bot*****/";
WebClient webClient = new WebClient();
public void GetMessagesUpdate()
{
var telegramBot = new TelegramBotClient(chatID + securePART);
string url = $"{primaryUrl}getUpdates?offset={update_id}";
var messageUpdate = webClient.DownloadString(url);
var msgs = JObject.Parse(messageUpdate)["result"].ToArray();
WriteLine(messageUpdate.ToString());
foreach (dynamic item in msgs)
{
update_id = Convert.ToInt32(item.update_id) + 1;
string userMessage = item.message.text;
string userId = item.message.from.id;
string useFirstrName = item.message.from.first_name;
string UserLastName = item.message.from.last_name;
string text = $"{useFirstrName} {UserLastName} {userId} {userMessage}";
Console.WriteLine(text);
switch (item.MessageType.Type)
{
case MessageType.Photo:
{
WriteLine("Прислали фото");
}
break;
default:
{
WriteLine("Что-то пошло не так");
}
break;
}
}
}
Switch语句执行过程中抛出异常:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Не удается выполнить привязки исполняющей среды по нулевой ссылке
简而言之,我根本不明白问题是什么?MessageType 是一个枚举。
有一本有趣的书——
C# для профессионалов
来自这个公民——乔恩·斯基特 。它详细讨论了dynamic
.我怎样才能重现这个例子:
目前
Console.WriteLine(test.UndefinedProperty)
我们有一个错误RuntimeBinderException
。因为运行时无法绑定,所以可以更简单地阅读——这个对象没有这样的属性。怎么解决问题?!
好吧,你可以愚蠢地捕捉到额头上的异常并忽略它:
你可以制作一个静态方法(扩展方法不起作用!):
并像这样使用:
有用的链接:
使用动态类型
C# 深入浅出,第四版
解决方案:
就我而言,我通过以下方式解决了产生的异常:我发现库
Telegram.Bot
有一个事件event EventHandler<MessageEventArgs> OnMessage;
(链接)我重写了负责使用事件显示消息的代码。简而言之,它看起来像这样:
在此选项中,可以为传输到机器人的特定类型的文档类型指定操作。
@Peter-Lavreniuk,感谢您的链接。