在c#中使用动态键创建字典
本文关键字:创建 字典 动态 | 更新日期: 2023-09-27 18:05:54
在用C/c++编程时,我有时使用一个字典,根据指定的键来引用函数。然而,我真的不知道如何在c#中有类似的东西允许我动态键。
我在Unity工作,我想调用一个函数,例如当我按下鼠标左键点击我的Unity项目,这是可能的吗?
我想你可以这样做:首先为您的任务定义一个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