首页 / C# / c#-从数据库填充函数字典
c#-从数据库填充函数字典
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-从数据库填充函数字典,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8642字,纯文字阅读大概需要13分钟。
内容图文
![c#-从数据库填充函数字典](/upload/InfoBanner/zyjiaocheng/885/6d747dae2a2b47f9a89a563543207706.jpg)
我正在使用MUD,当前命令处理程序是一个元组,该元组采用字符串readString和Player PlayerObj以及一个switch语句来确定返回的元组
public Tuple<string, Player> handleCMD(string readString, Player PlayerObj)
{
Tuple<string, Player> returnTuple = new Tuple<string, Player>(readString, PlayerObj);
string[] arguments = readString.Split(' ');
switch (arguments[0].ToLower())
{
case "addchange":
returnTuple = doAddChange(readString, PlayerObj);
break;
case "changes":
returnTuple = doChanges(readString, PlayerObj);
break;
case "score":
returnTuple = doScore(readString, PlayerObj);
break;
case "look":
returnTuple = doLook(readString, PlayerObj);
break;
case "north":
returnTuple = doWalk(arguments[0], PlayerObj);
break;
case "east":
returnTuple = doWalk(arguments[0], PlayerObj);
break;
case "south":
returnTuple = doWalk(arguments[0], PlayerObj);
break;
case "west":
returnTuple = doWalk(arguments[0], PlayerObj);
break;
case "quit":
returnTuple = doQuit(readString, PlayerObj);
break;
case "chat":
returnTuple = doChat(readString, PlayerObj);
break;
case "say":
returnTuple = doSay(readString, PlayerObj);
break;
case "who":
returnTuple = doWho(readString, PlayerObj);
break;
case "tell":
returnTuple = doTell(readString, PlayerObj);
break;
default:
returnTuple = doHuh(readString, PlayerObj);
break;
}
return returnTuple;
}
public Tuple<string, Player> doSay(string readString, Player PlayerObj)
{
DBHandler dbHandler = new DBHandler();
PlayerObj = dbHandler.GetPlayer(PlayerObj.PlayerName);
string returnString;
string[] arguments = readString.Split(' ');
if (arguments.Count() > 1 && arguments[1] != string.Empty && arguments[1] != null && arguments[1] != "" && arguments[1] != " ")
{
readString = readString.Trim().Replace("say ", "");
Message message = new Message(0, readString, PlayerObj.PlayerID, 0, 1, 1);
returnString = string.Format("You say \"{0}\"", readString);
foreach (int i in dbHandler.GetPlayersInRoom(PlayerObj.RoomID, PlayerObj.PlayerName))
dbHandler.AddMessage(new Message(0, message.MessageText, message.SenderPlayerID, i, message.MessageType, message.Ticked));
}
else
returnString = "[Syntax] : Say <Message>";
return new Tuple<string, Player>(returnString, PlayerObj);
}
我想用数据库表中填充的字典替换switch语句,这样我就可以在数据库表中添加和禁用命令/别名,而无需编辑代码
我试图这样做:
public Tuple<string, Player> handleCMD(string readString, Player PlayerObj)
{
Tuple<string, Player> returnTuple = new Tuple<string, Player>(readString, PlayerObj);
string[] arguments = readString.Split(' ');
DBHandler dbHandler = new DBHandler();
Dictionary<string, Delegate> cmdDictionary = new Dictionary<string, Delegate>();
foreach (Command playerCommand in dbHandler.GetCommands())
cmdDictionary.Add(playerCommand.CommandName, new Func<string, Player, Tuple<string, Player>>(playerCommand.CommandTuple));
if (cmdDictionary[arguments[0]] != null)
returnTuple = (Tuple<string, Player>)cmdDictionary[arguments[0]].DynamicInvoke(readString, PlayerObj);
else
returnTuple = doHuh(readString, PlayerObj);
return returnTuple;
}
问题是我收到错误消息:
cmdDictionary.Add(playerCommand.CommandName, new Func<string, Player, Tuple<string, Player>>(playerCommand.CommandTuple));
'GWOService.Command.CommandTuple' is a 'property' but is used like a 'method'
playerCommand.CommandName是一个字符串,该字符串=“ doSay”或“ doHuh”或任何元组的名称,但是可以使用以下命令:
cmdDictionary.Add(playerCommand.CommandName, new Func<string, Player, Tuple<string, Player>>(doSay/*playerCommand.CommandTuple*/));
更新资料
因此,我再次尝试了以下方法:
public Tuple<string, Player> handleCMD(string readString, Player PlayerObj)
{
Tuple<string, Player> returnTuple = new Tuple<string, Player>(readString, PlayerObj);
string[] arguments = readString.Split(' ');
DBHandler dbHandler = new DBHandler();
Dictionary<string, Delegate> cmdDictionary = new Dictionary<string, Delegate>();
foreach (Command playerCommand in dbHandler.GetCommands())
{
try
{
MethodInfo method = GetType().GetMethod(playerCommand.CommandTuple);
//Func<string, Player, Tuple<string, Player>> func = ( ) => { return (Tuple<string, Player>)(this.GetType().GetMethod(playerCommand.CommandTuple).Invoke(this, new object[0])); }
Func<string, Player, Tuple<string, Player>> func = (Func<string, Player, Tuple<string, Player>>)Delegate.CreateDelegate(typeof(Func<string, Player, Tuple<string, Player>>), method);
cmdDictionary.Add(playerCommand.CommandName, new Func<string, Player, Tuple<string, Player>>(func));
}
catch (Exception e)
{
dbHandler.LogEntry(PlayerObj, e.ToString());
}
}
if (cmdDictionary[arguments[0]] != null)
returnTuple = (Tuple<string, Player>)cmdDictionary[arguments[0]].DynamicInvoke(readString, PlayerObj);
else
returnTuple = doHuh(readString, PlayerObj);
//switch (arguments[0].ToLower())
//{
// case "addchange":
// returnTuple = doAddChange(readString, PlayerObj);
// break;
// case "changes":
// returnTuple = doChanges(readString, PlayerObj);
// break;
// case "score":
// returnTuple = doScore(readString, PlayerObj);
// break;
// case "look":
// returnTuple = doLook(readString, PlayerObj);
// break;
// case "north":
// returnTuple = doWalk(arguments[0], PlayerObj);
// break;
// case "east":
// returnTuple = doWalk(arguments[0], PlayerObj);
// break;
// case "south":
// returnTuple = doWalk(arguments[0], PlayerObj);
// break;
// case "west":
// returnTuple = doWalk(arguments[0], PlayerObj);
// break;
// case "quit":
// returnTuple = doQuit(readString, PlayerObj);
// break;
// case "chat":
// returnTuple = doChat(readString, PlayerObj);
// break;
// case "say":
// returnTuple = doSay(readString, PlayerObj);
// break;
// case "who":
// returnTuple = doWho(readString, PlayerObj);
// break;
// case "tell":
// returnTuple = doTell(readString, PlayerObj);
// break;
// default:
// returnTuple = doHuh(readString, PlayerObj);
// break;
//}
return returnTuple;
}
但是我得到了错误:
25号线
Func<string, Player, Tuple<string, Player>> func = (Func<string, Player, Tuple<string, Player>>)Delegate.CreateDelegate(typeof(Func<string, Player, Tuple<string, Player>>), method);
System.ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
at System.Delegate.CreateDelegate(Type type, MethodInfo method, Boolean throwOnBindFailure)
at System.Delegate.CreateDelegate(Type type, MethodInfo method)
at GWOService.CmdHandler.handleCMD(String readString, Player PlayerObj) in \Projects\GodWarsOxide\GWOService\CmdHandler.cs:line 25
解决方法:
您可以使用GetMethod通过名称获取需要调用的方法
this.GetType().GetMethod("doSay")
然后,您可以使用所需的参数和返回类型在MethodInfo的Invoke命令上创建Func或Delegate
var function = new Func<string, Player, Tuple<string, Player>>((arg1, arg2) => (Tuple<string, Player>)this.GetType().GetMethod("doSay").Invoke(this, new object[] { arg1, arg2 })));
打包以使其可重用
public Func<string, Player, Tuple<string, Player>> CreateFunction(string methodName)
{
if (this.GetType().GetMethods().Any(x => x.Name == methodName))
{
return new Func<string, Player, Tuple<string, Player>>((arg1, arg2) => (Tuple<string, Player>)this.GetType().GetMethod(methodName).Invoke(this, new object[] { arg1, arg2 }));
}
return null;
}
然后您可以将这些添加到您的字典中
var functions = new Dictionary<string, Func<string, Player, Tuple<string, Player>>>();
functions.Add("Say",CreateFunction("doSay"));
或从您的数据库
foreach (Command playerCommand in dbHandler.GetCommands())
{
if (!functions.ContainsKey(playerCommand.CommandName))
{
functions.Add(playerCommand.CommandName, CreateFunction(playerCommand.CommandTuple));
}
}
然后你可以随时打电话给他们
var result = functions["Say"]("Hello", new Player());
注意:
我建议替换Tuple< sting,Player>拥有一个不错的类,而不是像下面这样,因为在整个应用程序中处理它会比较轻松
public void Test()
{
Dictionary<string, Func<string, Player, MyResult>> functions = new Dictionary<string, Func<string, Player, MyResult>>();
functions.Add("Say",CreateFunction("doSay"));
var result = functions["Say"]("Hello", new Player());
}
public Func<string, Player, MyResult> CreateFunction(string methodName)
{
if (this.GetType().GetMethods().Any(x => x.Name == methodName))
{
return new Func<string, Player, MyResult>((arg1, arg2) => (MyResult)this.GetType().GetMethod(methodName).Invoke(this, new object[] { arg1, arg2 }));
}
return null;
}
public MyResult doSay(string value1, Player value2)
{
return new MyResult(value1, value2);
}
public class MyResult
{
public MyResult(string value1, Player value2)
{
Value1 = value1;
Value2 = value2;
}
public string Value1 { get; set; }
public Player Value2 { get; set; }
}
内容总结
以上是互联网集市为您收集整理的c#-从数据库填充函数字典全部内容,希望文章能够帮你解决c#-从数据库填充函数字典所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。