创建具有不同参数类型的 C# 函数列表
Create a list of C# Funcs with different parameter types
我希望能够创建多个 Func
s,每个都接受一个类型的实例和 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;
}
}
您可以创建代表字典。使用类型作为键。
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;
}
}
没有小狗或小猫在这个答案的制作过程中死亡。
我希望能够创建多个 Func
s,每个都接受一个类型的实例和 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;
}
}
您可以创建代表字典。使用类型作为键。
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;
}
}
没有小狗或小猫在这个答案的制作过程中死亡。