如何创建泛型函数在字典里

本文关键字:字典 函数 泛型 何创建 创建 | 更新日期: 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"]();
    }
}

我想把值设为泛型。这可能吗?

谢谢。

如何创建泛型函数<T>在字典里

类型必须在某处指定,所以您必须使您的类也泛型:

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);