[英]How can i get the parameter values of an anonymous method passed as a func?
[英]Accessing a method which was assigned to a passed in Func<> parameter
看起来我错过了一些显而易见的事情,但实际上无法弄清为什么我不能使用/访问分配给Func<>
参数的方法,我想在外部调用上下文中访问/调用它。
在简单示例下面:(实际results
数据类型不是string
而是某种复杂类型)
class Caller
{
private Func<string> factory;
public Caller()
{
this.factory = null;
var adapter = new Adapter(this.factory);
adapter.Adapt(...);
// then I would share this factory via IoC
dependencyContainer.RegisterUsingFactoryMethod<string>(this.factory);
// !!! but here is factory still not assigned
string results = this.factory();
}
}
class Adapter
{
private string results;
public Adapter(Func<string> factory)
{
factory = () => this.results;
}
public IOut Adapt(IIn input)
{
this.results = someCalculatedData;
}
}
这与委托无关,而与所有参数默认情况下都按值传递的事实无关。 如果factory
是int
或string
或StringBuilder
,则会看到相同的行为。
如果希望Service
构造函数修改参数的值,则需要ref
或out
参数。 但是,我个人建议您将其更改为使用返回 Func<string>
:
public class Caller
{
private readonly Func<string> factory;
public Caller()
{
this.factory = Service.GetFunc();
}
}
public class Service
{
public static Func<string> GetFunc()
{
return () => Guid.NewGuid().ToString();
}
}
(这里还有许多其他选项,例如方法组转换或属性。当我们没有太多上下文时,很难知道该推荐什么。)
显然,您想重命名该方法。 但是仅调用构造函数来修改out
参数将是非常奇怪的代码。
有关参数传递的更多信息,请参阅有关该主题的文章 。
您可以尝试将带有out参数的func粘贴到Service的构造函数吗?
例如
class Caller
{
private Func<string> factory;
public Caller()
{
this.factory = null;
var service = new Service(out this.factory);
// !!! but here is factory still not assigned
string results = this.factory();
}
}
class Service
{
public Service(out Func<string> factory)
{
factory = () => Guid.NewGuid().ToString();
}
}
这将确保编译器知道在Service构造函数中初始化对工厂参数的引用。 否则,您只是通过值将对null Func的引用传递给构造函数,然后在ctor内部的堆栈上将该函数局部分配给该变量。
请参阅此相关问题,以更清楚地了解ref和out参数。
最好的祝福,
您永远不会在被调用方分配工厂,
由于您没有通过引用将工厂传递给服务,因此调用者将看不到变量的更新。
我不确定是否可以通过引用将参数传递给构造器...
要调用Func<T...>
引用,只需要像调用普通方法一样进行调用。 即:
class Service
{
public Service(Func<string> factory)
{
string result = factory();
}
}
请注意, Func<string>
将返回string
类型。
编辑
从您的评论中,我已经意识到您在OP中的实际要求。 为了能够为任何参数分配值,您需要使用out
或ref
对其进行标记。 因此,您的声明将如下所示:
public Service(out Func<string> factory)
要么
public Service(ref Func<string> factory)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.