创建具有不同参数类型的 C# 函数列表

Create a list of C# Funcs with different parameter types

我希望能够创建多个 Funcs,每个都接受一个类型的实例和 returns 相同的类型,例如:

Func<Foo, Foo>
Func<Bar, Bar>

然后将它们添加到 List(或者可能添加到 Dictionary,由 Func 处理的类型键入)。

然后给定任何实例 y(其类型在编译时未知),我想检索并调用 Func将在 y.

上工作

我的要求是否可行?

您是否考虑过以下方法?

using System;
                    
public class Program
{
    public static void Main()
    {
        DoIt("Hello World");
        DoIt(1);
        DoIt(DateTime.Now);
    }
    
    static dynamic DoIt(dynamic t)
    {
        return InternalDoIt(t);
    }
    
    static object InternalDoIt(object obj) => throw new NotImplementedException();
    static string InternalDoIt(string str){
            Console.WriteLine(str);
            return str;
    }
    static int InternalDoIt(int i) {
            Console.WriteLine(i);
            return i;
    }
}

https://dotnetfiddle.net/RoXK0M

您可以创建代表字典。使用类型作为键。

Dictionary<Type, Delegate> _dictionary = new();

并且我们需要一种方法来添加委托:

bool Add<T>(Func<T, T> func)
{
    return _dictionary.TryAdd(typeof(T), func);
}

还有一个叫他们:

static T DoIt<T>(T t)
{
    if (_dictionary.TryGetValue(typeof(T), out var func))
    {
        return ((Func<T, T>)func).Invoke(t);
    }
   
    throw new NotImplementedException();
}

工作示例:

using System;
using System.Collections.Generic;
                    
public class Program
{
    private static Dictionary<Type, Delegate> _dictionary = new();
    
    public static void Main()
    {      
        Add<String>(InternalDoIt);
        Add<int>(InternalDoIt);
        DoIt("Hello World"); // Outputs "Hello World"
        DoIt(1); // Outputs "1"
        DoIt(DateTime.Now); // Throws NotImplementException
    }
    
    static bool Add<T>(Func<T, T> func)
    {
        return _dictionary.TryAdd(typeof(T), func);
    }
    
    static T DoIt<T>(T t)
    {
        if (_dictionary.TryGetValue(typeof(T), out var func))
        {
            return ((Func<T, T>)func).Invoke(t);
        }
        
        throw new NotImplementedException();
    }
    
    static string InternalDoIt(string str){
            Console.WriteLine(str);
            return str;
    }
    static int InternalDoIt(int i) {
            Console.WriteLine(i);
            return i;
    }
}

没有小狗或小猫在这个答案的制作过程中死亡。