在c#中使用动态键创建字典

本文关键字:创建 字典 动态 | 更新日期: 2023-09-27 18:05:54

在用C/c++编程时,我有时使用一个字典,根据指定的键来引用函数。然而,我真的不知道如何在c#中有类似的东西允许我动态键

我在Unity工作,我想调用一个函数,例如当我按下鼠标左键点击我的Unity项目,这是可能的吗?

在c#中使用动态键创建字典

我想你可以这样做:首先为您的任务定义一个Delegate(在您的示例中分配给按键的任务):

public delegate void MyJob();

然后定义你的字典:

Dictionary<string, MyJob> myBinding = new Dictionary<string, MyJob>()
{
    { "left", delegate() { Console.WriteLine("Left Key pressed"); } },
    { "right", delegate() { Console.WriteLine("Right Key pressed"); } },
    { "up", delegate() { Console.WriteLine("Up Key pressed"); } },
    { "down", delegate() { Console.WriteLine("Down Key pressed"); } }
};

最后使用它:

public void Mapper(string pressedKey)
{
    myBinding[pressedKey]();
}
我希望这能帮助你解决你的问题。

您可以使用Dictionary<KeyCode, System.Action>签名来实现这一点。获取所有的代码代码,并将它们存储到具有System.Enum.GetValues(typeof(KeyCode));的数组中。然后可以使用keyCodeToFuncDic.Add(KeyCode.YourKeyCode, YourFunction);

将键与函数配对

Update函数中,使用for循环遍历存储在开始的KeyCodes。检查这些键是否被按下了。如果按下,检查它是否在Dictionary中。如果字典中存在KeyCode,则使用按下的键来Invoke Dictionary值中的函数,这将最终调用存储在Dictionary中的函数。

代码:

Dictionary<KeyCode, System.Action> keyCodeToFuncDic = new Dictionary<KeyCode, System.Action>();
Array allKeyCodes;
void Start()
{
    //Get all codecodes
    allKeyCodes = System.Enum.GetValues(typeof(KeyCode));
    //Register Keycodes to functios
    keyCodeToFuncDic.Add(KeyCode.Mouse0, myFunction); //Left mouse
    keyCodeToFuncDic.Add(KeyCode.Mouse1, myFunction2); //Right mouse
}
void myFunction()
{
    Debug.Log("Left Mouse Clicked");
}
void myFunction2()
{
    Debug.Log("Right Mouse Clicked");
}
void Update()
{
    foreach (KeyCode tempKey in allKeyCodes)
    {
        //Check if any key is pressed
        if (Input.GetKeyDown(tempKey))
        {
            //Check if the key pressed exist in the dictionary key
            if (keyCodeToFuncDic.ContainsKey(tempKey))
            {
                //Debug.Log("Pressed" + tempKey);
                //Call the function stored in the Dictionary's value
                keyCodeToFuncDic[tempKey].Invoke();
            }
        }
    }
}

当我看到"动态键"时,我想到了其他一些东西,比如将dynamic类型作为字典的键。然而,你所需要的可以很容易地实现。在c#中,"指向函数的指针"被称为delegates(但比C指向函数的指针要好得多),因此你需要一个字典,它的键是char类型,值是这些委托中的一个。在。net framework 4.0及以上版本中,有预定义的通用委托,称为Func<T...>Action<T...>。基本上,如果你想让你的函数返回一个值,你将使用Func, Action将被用来代替void方法。

你可以这样写:

var keyMap = new Dictionary<char, Func<string, bool>>()
{
    {'w', MoveUp},
    {'s', MoveDown},
    {'a', s => true}, // using lambda expression
    {
        'd', delegate(string s)
        {
            if (string.IsNullOrWhiteSpace(s) == false)
            {
                //
            }
            return true;
        }
    } // using anonymous method
};
// then you can call those like this
var allow = keyMap['w']("some input");
if (allow)
{
    // .... 
}
public bool MoveUp(string input)
{
    return true;
}
public bool MoveDown(string input)
{
    return true;
}

文档如下https://msdn.microsoft.com/en-us/library/bb549151(v=vs.110).aspx