具有任何签名c#的函数的泛型类
本文关键字:函数 泛型类 任何签 | 更新日期: 2023-09-27 18:24:57
我正在尝试将python代码转换为c#
class fwrapper:
def __init_ _(self,function,childcount,name):
self.function=function
self.childcount=childcount
self.name=name
class node:
def __init_ _(self,fw,children):
self.function=fw.function
self.name=fw.name
self.children=children
def evaluate(self,inp):
results=[n.evaluate(inp) for n in self.children]
return self.function(results)
我发现在c#中很难实现。1.在类fwrapper.function中,它可以接受具有任何签名的函数。2.获得函数的返回类型,该函数可用于提及评估函数的返回类型
非常感谢
不完全确定你想做什么,但如果你有这样的东西:
public class FWrapper<TChild, TResult>{
private int childCount;
private string name;
private Func<TChild, TResult> function;
public Func<TChild, TResult> Function { get { return function; } }
public FWrapper(Func<TChild, TResult> Function, int ChildCount, string Name){
this.childCount = ChildCount;
this.name = Name;
this.function = Function;
}
}
public class Node<TChild, TResult>{
private FWrapper<TChild, TResult> fw;
private IEnumerable<TChild> children;
public Node(FWrapper<TChild, TResult> FW, IEnumerable<TChild> Children){
this.fw = FW;
this.children = Children;
}
public IEnumerable<TResult> Evaluate(){
var results = new List<TResult>();
foreach(var c in children){
results.Add(fw.Function(c));
}
return results;
}
}
现在,您有一个FWrapper类,它接受任何将TChild作为参数的函数,并返回一个TResult和一个使用相同TChild和TResult类型的Node类,因此,例如,您可以执行以下操作(琐碎的示例)
//Generic function that takes an int and returns a string
var func = new Func<int, string>(childInt => {
var str = "'" + childInt.ToString() + "'";
return str;
});
var fw = new FWrapper<int, string>(func, 10, "Foobar");
var children = new List<int>(){ 1,2,3,4,5,6,7,8,9,10 };
var node = new Node<int, string>(fw, children);
var results = node.Evaluate();
foreach(var r in results){
Console.WriteLine(r);
}
//'1'
//'2'
//..
//..
//'9'
//'10'
我猜是这样的吗?
class Node {
private FWrapper fw;
private List<Node> children;
public Node(FWrapper fw, List<Node> children){
this.fw = fw;
this.children = children;
}
public Evaluate(Object inp){
var results = from child in children select child.Evaluate(inp);
return fw.function(results);
}
}
这只是一个起点。