Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据库填充函数字典_C#_.net_Dictionary_Tuples - Fatal编程技术网

C# 从数据库填充函数字典

C# 从数据库填充函数字典,c#,.net,dictionary,tuples,C#,.net,Dictionary,Tuples,我正在处理一个MUD,当前的命令处理程序是一个元组,它使用字符串readString和Player PlayerObj以及switch语句来确定返回元组 public Tuple<string, Player> handleCMD(string readString, Player PlayerObj) { Tuple<string, Player> returnTuple = new Tuple<string, Player>(readString,

我正在处理一个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);
}
public Tuple handleCMD(string readString,Player playerbj)
{
Tuple returnTuple=新的Tuple(readString,PlayerObj);
string[]参数=readString.Split(“”);
开关(参数[0].ToLower())
{
案例“addchange”:
returnTuple=doAddChange(readString,PlayerObj);
打破
案例“变更”:
returnTuple=doChanges(readString,PlayerObj);
打破
案例“得分”:
returnTuple=doScore(readString,PlayerObj);
打破
案例“外观”:
returnTuple=doLook(readString,PlayerObj);
打破
“北”案:
returnTuple=doWalk(参数[0],PlayerObj);
打破
“东”案:
returnTuple=doWalk(参数[0],PlayerObj);
打破
“南方”案:
returnTuple=doWalk(参数[0],PlayerObj);
打破
“西部”案:
returnTuple=doWalk(参数[0],PlayerObj);
打破
“退出”案例:
returnTuple=doQuit(readString,PlayerObj);
打破
案例“聊天”:
returnTuple=docat(readString,PlayerObj);
打破
案例“说”:
returnTuple=doSay(readString,PlayerObj);
打破
案例“世卫组织”:
returnTuple=doWho(readString,PlayerObj);
打破
案例“告诉”:
returnTuple=doTell(readString,PlayerObj);
打破
违约:
returnTuple=doHuh(readString,PlayerObj);
打破
}
返回元组;
}
公共元组doSay(字符串readString,Player-PlayerObj)
{
DBHandler DBHandler=新的DBHandler();
playerbj=dbHandler.GetPlayer(playerbj.PlayerName);
字符串返回字符串;
string[]参数=readString.Split(“”);
if(arguments.Count()>1&&arguments[1]!=string.Empty&&arguments[1]!=null&&arguments[1]!=“”&&arguments[1]!=“”)
{
readString=readString.Trim();
Message Message=新消息(0,readString,playerbj.PlayerID,0,1,1);
returnString=string.Format(“您说\“{0}\”,readString);
foreach(dbHandler.GetPlayersInRoom(playerbj.RoomID,playerbj.PlayerName)中的int i)
dbHandler.AddMessage(新消息(0,Message.MessageText,Message.SenderPlayerID,i,Message.MessageType,Message.Ticked));
}
其他的
returnString=“[Syntax]:Say”;
返回新元组(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;
}
public Tuple handleCMD(string readString,Player playerbj)
{
Tuple returnTuple=新的Tuple(readString,PlayerObj);
string[]参数=readString.Split(“”);
DBHandler DBHandler=新的DBHandler();
Dictionary cmdDictionary=新字典();
foreach(dbHandler.GetCommands()中的命令playerCommand)
添加(playerCommand.CommandName,新函数(playerCommand.CommandTuple));
if(cmdDictionary[参数[0]]!=null)
returnTuple=(Tuple)cmdDictionary[参数[0]].DynamicInvoke(readString,PlayerObj);
其他的
returnTuple=doHuh(readString,PlayerObj);
返回元组;
}
问题是我收到了错误消息:

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'
cmdDictionary.Add(playerCommand.CommandName,newfunc(playerCommand.CommandTuple));
“GWOService.Command.CommandTuple”是一个“属性”,但与“方法”一样使用
playerCommand.CommandName是一个字符串,该字符串的名称为=“doSay”或“doHuh”或元组的任何名称,但以下操作有效:

cmdDictionary.Add(playerCommand.CommandName, new Func<string, Player, Tuple<string, Player>>(doSay/*playerCommand.CommandTuple*/));
cmdDictionary.Add(playerCommand.CommandName,新函数(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;
}
public Tuple handleCMD(string readString,Player playerbj)
{
Tuple returnTuple=新的Tuple(readString,PlayerObj);
string[]参数=readString.Split(“”);
DBHandler DBHandler=新的DBHandler();
Dictionary cmdDictionary=新字典();
foreach(dbHandler.GetCommands()中的命令playerCommand)
{
尝试
{
MethodInfo method=GetType().GetMethod(playerCommand.CommandTuple);
//Func Func=()=>{return(Tuple)(this.GetType().GetMethod(playerCommand.CommandTuple).Invoke(this,new object[0]);}
Func Func=(Func)Delegate.CreateDelegate(typeof(Func),方法);
添加(playerCommand.CommandName,新函数(Func));
}
捕获(例外e)
{
LogEntry(playerbj,e.ToString());
}
}
if(cmdDictionary[参数[0]]!=null)
returnTuple=(Tuple)cmdDictionary[参数[0]].DynamicInvoke(readString,PlayerObj);
其他的
returnTuple=doHuh(readString,PlayerObj);
//开关(参数[0].ToLower())
//{
//案例“addchange”:
//returnTuple=doAddChange(readString,PlayerObj);
//中断;
//案例“变更”:
//returnTuple=doChanges(readString,PlayerObj);
//中断;
//案例“得分”:
//returnTuple=doScore(readString,PlayerObj);
//中断;
//案例“外观”:
//returnTuple=doLook(readString,PlayerObj);
//中断;
//“北”案:
//returnTuple=doWalk(参数[0],PlayerObj);
//中断;
//“东”案:
//returnTuple=doWalk(参数[0],PlayerObj);
//中断;
//“南方”案:
//returnTuple=doWalk(argum
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
cmdDictionary.Add(playerCommand.CommandName, new Func<string, Player, Tuple<string, Player>>(playerCommand.CommandTuple));
returnTuple = (System.Tuple<string,GWOService.Player>)cmdDictionary[arguments[0]].DynamicInvoke(readString, PlayerObj);
this.GetType().GetMethod("doSay")
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());
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; }
}