如何创建泛型函数在字典里
本文关键字:字典 函数 泛型 何创建 创建 | 更新日期: 2023-09-27 17:50:21
是否可以使
public class MyClass : Dictionary<string, Func<string>>
public class MyClass : Dictionary<string, Func<T>>
实际上我有
public class MyClass : Dictionary<string, Func<string>>
{
public void MyFunction(string key)
{
if (this.ContainsKey(key))
this[key]();
else
this["no match"]();
}
}
我想把值设为泛型。这可能吗?
谢谢。
类型必须在某处指定,所以您必须使您的类也泛型:
public class Myclass<T> : Dictionary<string, Func<T>> {
public T MyFunction(string key) {
if (this.ContainsKey(key)) {
return this[key]();
} else {
return this["no match"]();
}
}
}
您可以在对象实例化时指定类型。我已经提供了工作代码。
using System;
using System.Collections.Generic;
namespace GenericDictionary
{
class Program
{
static void Main(string[] args)
{
DictionaryUser dictionaryUser = new DictionaryUser();
Console.ReadLine();
}
class GenericFuncDictionary<T> : Dictionary<string, Func<T>>
{
public void DisplayValues()
{
foreach(Func<T> fun in this.Values)
Console.WriteLine(fun());
}
}
class DictionaryUser
{
public DictionaryUser()
{
GenericFuncDictionary<string> myDictionary = new GenericFuncDictionary<string>();
myDictionary.Add("World", FunWorld);
myDictionary.Add("Universe", FunUniverse);
myDictionary.DisplayValues();
}
public string FunWorld()
{
return "Hello World";
}
public string FunUniverse()
{
return "Hello Universe";
}
}
}
}
如果您希望Func<T>
的类型参数作为MyClass
签名的一部分(例如MyType<T>
)作为其他答案所假设的,或者如果您希望能够将任何类型的Func<T>
存储在字典中并在运行时找出正确的东西,则不完全清楚。
如果你想要后一种情况,你使用c# 4.0,那么你可以这样做:
class MyClass : Dictionary<string, Func<object>>
{
public void MyFunction<T>(string key)
{
Func<object> func;
if (this.TryGetValue(key, out func) && func is Func<T>)
func();
else
{
func = this["no match"];
if (func is Func<T>)
func();
else
{ */ do something else, or maybe you don't care about the type of "no match" */ }
}
}
}
使用c# 4.0的原因是你现在可以这样写:
MyClass myClass = ...;
Func<string> stringFunc = ...;
myClass["test"] = stringFunc;
在c# 4.0之前,不可能将Func<string>
转换为Func<object>
。在这种情况下,您必须编写以下两行中的任意一行(不必费心检查第一行是否可以在4.0之前编译):
myClass["test"] = () => stringFunc();
myClass["test"] = () => (object) stringFunc();
你可以这样写:
MyClass myClass = ...;
myClass.MyFunction<string>("test");
下面的场景将允许您使用元素字典作为输入参数发送,并获得与输出参数相同的元素。
首先在顶部添加以下行:
using TFunc = System.Func<System.Collections.Generic.IDictionary<string, object>, System.Collections.Generic.IDictionary<string, object>>;
然后在类中定义字典,如下所示:
private Dictionary<String, TFunc> actions = new Dictionary<String, TFunc>(){
{"getmultipledata", (input) =>
{
//DO WORKING HERE
return null;
}
},
{"runproc", (input) =>
{
//DO WORKING HERE
return null;
}
}
};
这将允许你运行这些匿名函数,语法类似于:
var output = actions["runproc"](inputparam);