我正在写一个电报机器人。不管我怎么用谷歌搜索,但到处都只有发送消息和其他东西的手册。我对机器人的架构感兴趣。
我的机器人很简单,基本上取代了程序的 UI。我做了类似状态机的事情,但没有从一种状态到另一种状态的显式转换。那些。我有一堆类继承自 BaseBotState 类的 Activate 方法。
当前状态存储在描述用户的对象中。
激活函数更改用户的当前状态,并在下一条消息中调用不同的状态。
有没有和我类似的更好的方法?某种最佳实践?
如果问题不是很具体,我深表歉意。
我正在写一个电报机器人。不管我怎么用谷歌搜索,但到处都只有发送消息和其他东西的手册。我对机器人的架构感兴趣。
我的机器人很简单,基本上取代了程序的 UI。我做了类似状态机的事情,但没有从一种状态到另一种状态的显式转换。那些。我有一堆类继承自 BaseBotState 类的 Activate 方法。
当前状态存储在描述用户的对象中。
激活函数更改用户的当前状态,并在下一条消息中调用不同的状态。
有没有和我类似的更好的方法?某种最佳实践?
如果问题不是很具体,我深表歉意。
我有一个表格列表(System.Windows.Forms.Form)。我想从此列表中获取特定类型的表单。也许代码会更清晰:
public List<Form> Forms = new List<Form>()
{
new HelloForm(),
new SomeForm()
};
public T GetForm<T>() where T : Form
{
return Forms.Find(x => x.GetType() == T);
}
GetForm 函数中的错误:T 是在此上下文中无效的类型。如何正确书写?
澄清:.Net Framework 2.0(Linq 缺失)
谷歌搜索但不明白如何将值插入 MySql 表。
让我们说这个请求:
INSERT INTO employee(id, name) VALUES(200, 'Jason');
如果 id=200,将返回异常:
ERROR 1062 (23000): Duplicate entry '200' for key 'PRIMARY'
我想知道数据库是如何知道这个密钥的存在的?是循环遍历表中的所有值,还是进行二分查找?
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(item);
string title=null;
string cost= null;
var titleNode = doc.DocumentNode.SelectSingleNode("//span[contains(@class, 'title-info-title-text')]");
if (titleNode != null)
title = titleNode.InnerText;
var costNode = doc.DocumentNode.SelectSingleNode("//span[contains(@class, 'js-item-price')]");
if(costNode!=null)
cost = costNode.GetAttributeValue("content", "0");
这段代码在多个线程中执行,通常一切都很好。但有时 SelectSingleNode 返回 null。我设置了一个断点并手动检查。所需的标签是。感觉 doc.LoadHtml() - 异步工作,周期性地没有时间加载页面。还是我的内存快用完了?
也许有人遇到过这样的问题?
有这个标记:
<ListView ItemsSource="{Binding Variants}">
<ListView.ItemTemplate>
<DataTemplate>
<RadioButton Content="(???)" GroupName="Variants"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
用于绑定到ItemSource Variants的是一个字符串数组。我无法理解我需要在内容中写什么RadioButton(现在有三个问号)。
我无法弄清楚问题是什么。MainVM 存在于 StepByStepServer.ViewModels 中。当我将它输入 Xaml 时,甚至 ItelliSens 也会向我建议它作为 DataContext。应用程序正常构建并在组装期间拉起 MainVM。但在编辑器中,它发誓并且不编译 xaml 标记。
我经常遇到这个错误,每次都通过对文件、名称空间和代码的奇怪操作来解决。在某些时候 View 仍然可以找到 VM。不知道如何解决这个错误?
我在输出中注意到了这一点。这可能是问题吗?
C:\Users[UserName]\AppData\Local\Microsoft\VisualStudio\15.0_038c39d7\Designer\ShadowCache\sthjutrr.znm\1sb2wpcf.lni\Microsoft.Practices.ServiceLocation.dll 尝试从网络共享加载程序集以前版本中的情况 .NET Framework 可能会导致程序集被沙盒化。此版本的 .NET Framework 不包含默认的 CAS 策略,因此此下载可能很危险。如果此加载不打算隔离程序集,请启用 loadFromRemoteSources 开关。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=155569。
我试图清理 ShadowCache。
我使用 DataGridTemplateColumn 而不是通常的 DataGridTextColumn,因为 我不喜欢缺少文本换行(长文本)。
<DataGridTemplateColumn Header="Текст вопроса" MaxWidth="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox TextWrapping="Wrap" Text="{Binding Text,
UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
问题是当你点击ENTER的时候,元素并没有被创建,而是出现了换行。如何实现像你这样的行为PlaceHolder?
也许我没有正确的方法,文本换行可能会以不同的方式实现。我很乐意提供建议)
也许我应该使用迭代触发器跟踪焦点的丢失并将元素添加到集合中?那么在哪里采取,已经介绍了什么?
我有一个 WsEvent 类:
internal class WsEvent
{
public string Name { get; private set; }
public void Invoke() {}
}
还有它的广义继任者:
internal class WsEvent<T> : WsEvent
{
public T EventData { get; private set; }
public void Invoke(T Data) {}
}
我想在使用泛型类时隐藏基类的 Invoke() 方法。现在 IntelliSens 建议泛型类实例具有重载的 Invoke() 和 Invoke(T) 方法。我只想要调用(T)。
也许整个方法是错误的。我正在尝试随机学习通用类)
最近出现了一个问题。编辑在撒谎。就像我在 pubg 中与他同时以最高速度进行黑客攻击。甚至是新的空项目。当您在检查器中单击 GO 时,响应时间为 2 秒到 1 分钟。
我尝试重新安装设备。包括清理 AppData。
也许团结也受到最近互联网问题的影响。
可能还有哪些其他选择?
有 10 个立方体。在每个挂着相同的材料。是否可以更改单个立方体的颜色?现在材料的颜色发生了变化,所有的立方体都被重新绘制了。颜色将从代码中设置,我不知道将使用什么颜色,因此创建 10 种不同颜色的材料不是一种选择。
我最近开始学习 MVVM,到目前为止它已经引起了更多的问题。所谓的松散耦合——对我来说更像是“弱跟踪行为”。我正在使用 Prism.wpf。创建了委托命令。在 CanExecute 中指定 bool 模型变量。每次变量更改时,我都会调用 RaisePropertyChanged()。但是命令挂起的按钮不响应更改。还应该指定什么,以便每次通过模型更改进行更改时调用 CanExecute?
HttpListener 有一个包装类。立即从构造函数启动侦听器。此类通过标记添加为 DataContext。
我知道工作室在开发过程中显然会编译代码以在标记中显示依赖属性。
问题是即使没有运行项目,服务器也可以工作。而且当你尝试启动它时,它发誓这个前缀已经在这台电脑上注册了。
最终,工作室决定足够了。挂了。我必须结束她的痛苦
当然,您可以将服务器启动移动到单独的方法中,然后使用命令启动它。但我想解决问题,而不是绕过它。
有一个类:
public class GLine : Button
{
public int x, y;
Game game;
public GLine(int x, int y)
{
this.x = x;
this.y = y;
Grid.SetRow(this, y);
Grid.SetColumn(this, x);
DataContextChanged += GLine_DataContextChanged;
}
private void GLine_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
game = (Game)DataContext;
Click += game.PlayerClick;
}
}
如何使用放置该对象的 UserControl 的标记中描述的样式设置此类的对象?
TargetType = "Button" - 不起作用。
我参与了一个项目,在该项目中,我在获胜时有一个客户端聊天。寻找最好的方法。偶然发现了 SignalR,但找不到在 Linux 服务器上实现它的方法。真的有必要放弃几乎现成的解决方案吗?
如果有什么不清楚的地方:我在win下做一个聊天。服务器将由其他人在 linux 下开发。如果我可以通过 SignalR 与服务器通信,那对我来说将是理想的。最好使用 WebSocket 传输。
抱歉,我想不出更好的方式来表达这个问题。我理解反思。我有自己的伪 WAMP 协议自行车 =) 我想通过 RPC 远程调用方法。因为我了解反射,所以我想让应用程序可扩展。那些。这样将来我就可以编写一个插件库。将其放入 wamp-server 文件夹并远程使用它。
实际上,当我在我的库中使用指向其他库的链接时,问题就出现了。服务器本身看不到第二个库,因此无法从我的库中执行该方法。
除了我的图书馆之外,我还可以如何连接我所引用的那些?
目前的方法是:
private string CallInvoke(WebSocketSession session, Call call)
{
try
{
string filepath = Environment.CurrentDirectory + "/Plugins/" + call.PluginFileName;
//Если файл плагина не найден
if (!File.Exists(filepath))
{
CallError callError = new CallError(call.CallId, "Plugin file not found.\r\n(" + filepath + ")");
return JsonSerialize(callError);
}
Assembly asm = Assembly.LoadFile(filepath);
Type _class = null;
MethodInfo _method = null;
var types = asm.GetTypes();
//Если в плагине нет нужного класса
if (types.Count(x => x.Name == call.ClassName) == 0)
{
CallError callError = new CallError(call.CallId, "Class \"" + call.ClassName + "\" not found in assembly \"" + asm.FullName + "\".");
return JsonSerialize(callError);
}
_class = types.Single(x => x.Name == call.ClassName);
var methodInfos = _class.GetMethods();
//Если в классе нет нужного метода
if (methodInfos.Count(x => x.Name == call.MethodName) == 0)
{
CallError callError = new CallError(call.CallId, "Method \"" + call.MethodName + "\" not found in class \"" + call.ClassName + "\".");
return JsonSerialize(callError);
}
_method = methodInfos.Single(x => x.Name == call.MethodName);
object result = null;
if (call.Params is null)
result = _method.Invoke(null, null);
else
result = _method.Invoke(null, new object[] { call.Params });
CallResult callResult = new CallResult(call.CallId, result);
return JsonSerialize(callResult);
}catch(Exception ex)
{
CallError callError = new CallError(call.CallId, ex.Message);
return JsonSerialize(callError);
}
}
我知道这是一个普遍的问题。但我迫切需要它,而且我根本不是繁荣昌盛的。
您需要启用此功能:
DLL_EXPORT int __stdcall EvalCRC(IStream* Data, IStream* Params, IStream* Output)
{
if (!Data) return ERROR_NULL_DATA;
// Data - это входной поток с прошивкой, контрольку в которой нужно пересчитать
// Params и Output пока не используются и зарезервированы на будущее
int Result = PLUGIN_SUCCESS; // По-умолчанию возвращаем результат успешного выполнения
ULARGE_INTEGER size_;
LARGE_INTEGER larg_;
//ENCODE_START
larg_.QuadPart = 0;
Data->Seek(larg_, STREAM_SEEK_END, &size_);
// Считаем КС прошивки
if (size_.QuadPart == VALIDFWSIZE1 || size_.QuadPart == VALIDFWSIZE2)
{
try
{
char arr[IDLEN+1];
ULONG ulong;
unsigned int caloffset;
switch(size_.QuadPart)
{
case VALIDFWSIZE1:
{
// Калибровки
larg_.QuadPart = CAL_POS1;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
arr[IDLEN]=0x00;
if (CheckNumber(arr)) caloffset=CAL_POS1;
else return ERROR_SIGNATURE;
}
break;
case VALIDFWSIZE2:
{
// Фулл
larg_.QuadPart = CAL_POS2;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
arr[IDLEN]=0x00;
if (CheckNumber(arr)) caloffset=CAL_POS2;
else
{
larg_.QuadPart = CAL_POS3;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
Data->Read(&arr, sizeof(arr), &ulong); // Вычитываем идентификатор
arr[IDLEN]=0x00;
if (CheckNumber(arr)) caloffset=CAL_POS3;
else return ERROR_SIGNATURE;
}
}
break;
}
larg_.QuadPart = caloffset;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
WORD wval=0;
for(unsigned int i=0;i<(cRangeSize/2)-1;i++)
{
WORD wword;
Data->Read(&wword, sizeof(WORD), &ulong);
wword = (wword >> 8) | (wword << 8); // Переворачиваем
if (i!=cCSPos/2) wval += wword; // Считаем все, кроме контрольных сумм
}
wval=0-wval;
larg_.QuadPart = caloffset+cCSPos;
Data->Seek(larg_ ,STREAM_SEEK_SET, &size_);
wval = (wval >> 8) | (wval << 8); // Переворачиваем
Data->Write(&wval, sizeof(WORD), &ulong);
}
catch(...)
{
Result = ERROR_EXCEPTION;
}
}
else Result = ERROR_INVALID_SIZE;
return Result;
}
为大家试过,然后数据类型不匹配,然后只是一些没有错误和结果的崩溃。如果不难,请告诉我连接字符串应该是什么样子?
有一个桌面程序可以向通过 com-port 连接的设备发送命令。是否可以在 C# 中嗅探从软件到设备的流量?像 Mitm 这样的东西浮现在脑海中,即 创建您自己的端口并通过它传递流量。可能吗?还是应该以其他方式完成?
我正在尝试完成信息请求。遵循了 api 的所有说明,但仍然得到 404。
我想执行来自 TradeApi getInfo 的请求。POST https://yobit.net/tapi/getInfo?nonce=1 标头:密钥:{api public key} 签名:{string "?nonce=1" 通过 HMAC-SHA512 用私钥编码}
响应总是 404。怎么了?
我附上代码。要求:
public APIResponse Request(string method, Dictionary<string, string> param = null, int ReRequestCount = 3)
{
lock (locker)
nonce = IncrementNonce();
string urlParamStr = "?";
using (HttpRequest request = new HttpRequest())
{
if (param != null)
foreach (KeyValuePair<string, string> pair in param)
{
request.AddUrlParam(pair.Key, pair.Value);
urlParamStr += pair.Key + "=" + pair.Value + "&";
}
request.AddUrlParam("nonce", nonce);
urlParamStr += "nonce=" + nonce;
string signedData = Get_HMAC_SHA512_Hash(Sign, urlParamStr);
request.AddHeader("Key", Key);
request.AddHeader("Sign", signedData);
HttpResponse response = request.Post("https://yobit.net/tapi/" + method.ToString());
if (response.StatusCode != HttpStatusCode.OK)
{
if (ReRequestCount > 0)
{
return Request(method, param, --ReRequestCount);
}
else
{
return null;
}
}
else
{
return JsonConvert.DeserializeObject<APIResponse>(response.ToString());
}
}
}
HMAC 生成器:
public string Get_HMAC_SHA512_Hash(string key, string source)
{
byte[] secretkeyBytes = Encoding.UTF8.GetBytes(key);
byte[] inputBytes = Encoding.UTF8.GetBytes(source);
using (var hmac = new HMACSHA512(secretkeyBytes))
{
byte[] hashValue = hmac.ComputeHash(inputBytes);
string s = "";
for (int i = 0; i < hashValue.Length; i++)
{
s += string.Format("{0:x2}", hashValue[i]);
}
return s;
//return System.Convert.ToBase64String(hashValue);
}
}
有一个 WPF 应用程序。我已经写了很多代码,我不想创建一个控制台并在那里传输代码。是否有可能以某种方式将我的应用程序变成一个几乎没有流血事件的控制台应用程序?项目属性中的输出类型已更改。现在,据我了解,您需要更改入口点,以便不初始化窗口(正确,我不明白如何写单词(=)。我试图注释掉该行:
InitializeComponent();
但是窗口仍然出现......显然,我不明白这一行。
有一个包含 8GB 小 (1-5MB) 文件的文件夹。有一个应用程序使用这些文件之一。我需要确定当前正在使用哪个文件。
我认为它一直在监听该过程并试图捕捉对 winApi 的调用以打开文件。或者遍历所有文件并尝试打开它们进行写入。
这两种选择都有些不合理。有人可以告诉我如何处理我的情况吗?