我可以在 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)
.
我想创建命名函数:充当 Func
的对象,但也有一个包含人工解释名称的字符串字段。
自然的方法是创建 class NamedFunc<T0,T1> : Func<T0,T1> { string name; }
但不幸的是 Func 不是 class。所以我正在寻找解决方法。
最终目标是我有一个函数 DoMethod(MyObject victim, Funcop
的字母数字表示(出于缓存和兼容性原因) .目前我使用 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)
.