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