我可以在 C# 中将字符串附加到 Func 吗?

Can I attach a string to a Func in C#?

我想创建命名函数:充当 Func 的对象,但也有一个包含人工解释名称的字符串字段。

自然的方法是创建 class NamedFunc<T0,T1> : Func<T0,T1> { string name; } 但不幸的是 Func 不是 class。所以我正在寻找解决方法。

最终目标是我有一个函数 DoMethod(MyObject victim, Func op) 并且在 DoMethod 内部我需要 op 的字母数字表示(出于缓存和兼容性原因) .目前我使用 op.toString().hashCode().toString(),但我想要更有意义的东西,这样我就可以真正看到哪个文件属于 sum、square 等,而不仅仅是看到 8202589252、58809258520 等

例如,我想向 DoMethod 传递类似于 NewFunc<double,double> square = new NewFunc<double,double>(x=>x*x , "square"); 的内容,然后在调用 DoMethod(victim, square) 时,DoMethod 将能够以某种方式恢复该函数的字符串是“square”而不是“功能<双倍,双倍> x => x * x”。同时,我希望人们也能够仅使用常规 Func 作为输入(无需重载方法)。

有什么可行的办法吗?还是我在寻找不可能的东西?

尽管如您所说,您不能使用继承,因为 Func 不是 class,您仍然可以使用组合:

public class NamedFunc<T, R> {
    public string Name { get; }
    public Func<T, R> Invoke { get; }
    
    public NamedFunc(Func<T, R> function, string name) {
        Name = name;
        Invoke = function;
    }
    
    public static implicit operator Func<T, R>(NamedFunc<T, R> namedFunc) 
        => namedFunc.Invoke;
}

而且你将能够做你想做的事:

NamedFunc<double,double> square = new NamedFunc<double,double>(x=>x*x , "square");

要获取其名称,只需执行 square.Name。要调用它,只需执行 square.Invoke(someNumber).