C# 来自Func委托的多个值

C# 来自Func委托的多个值,c#,C#,虽然有一些答案是通过并发集合中的惰性值来解决多音,但这个问题涉及接收和返回值的Func lambda 仅使用返回类型的Func解决方案(不接受参数) publicstaticiproductgetinstance(字符串键,Func prod) { 返回instances.GetOrAdd(key,newlazy(prod)).Value; } //用法 Product.GetInstance(“foo”,()=>新产品(“foo”);//无参数 问题适用于接受值并返回值的Func,因此这意

虽然有一些答案是通过并发集合中的惰性值来解决多音,但这个问题涉及接收和返回值的Func lambda

仅使用返回类型的Func解决方案(不接受参数)

publicstaticiproductgetinstance(字符串键,Func prod)
{
返回instances.GetOrAdd(key,newlazy(prod)).Value;
}
//用法
Product.GetInstance(“foo”,()=>新产品(“foo”);//无参数

问题适用于接受值并返回值的Func,因此这意味着在它进入惰性结构之前会涉及一些构造函数调用。这样的问题如何解决

public static IProduct GetProductInstance(string key, Func<string, IProduct> prod) 
{

}


// Usage

Product.GetInstance("foo", key => new Product(key)); // with params
公共静态IPProduct GetProductInstance(字符串键,Func prod)
{
}
//用法
Product.GetInstance(“foo”,key=>新产品(key));//与params

如果您希望实现的是将
传递给
产品的构造函数
,则以下操作将完成:

公共静态IPProduct GetProductInstance(字符串键,Func prod)
{
返回instanceMap.GetOrAdd(key,newlazy(()=>prod(key))).Value;
}

请解释一下,因此传递到字典的
委托必须是无参数的,我正在尝试
新建Lazy(k=>prod(k))
,这意味着我希望
Lazy
将密钥传递给代理并从中获取值,因为
Lazy
不知道最终构造任何构造所需的值,它只接受
Func
。正如您所看到的,这意味着类似于
k=>prod(k)
的lambda将无法工作(因为它属于
Func
)。然而,由于闭包的强大功能(如我的回答中所示),
prod
参数存储在一个特殊的类中。这个特殊类还有一个签名为
IProduct b_uu0()
(实际方法的名称可能不同)的方法,它完全可以分配给
Func
。所以它是有效的。我回答的代码能解决你的问题吗?
public static IProduct GetProductInstance(string key, Func<string, IProduct> prod) 
{

}


// Usage

Product.GetInstance("foo", key => new Product(key)); // with params