![](/img/trans.png)
[英]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.