微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决创建具有不同参数类型的 C# Func 列表

我希望能够创建多个 Func,每个都接受一个类型的实例并返回相同的类型,例如:

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

然后将这些添加List(或者可能添加Dictionary,由 Func 处理的类型键控)。

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

我所要求的可能吗?

解决方法

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

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

在制作这个答案时没有小狗或小猫死亡。

,

您是否考虑过以下方法?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。