Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 存储对要创建的对象的引用_C# 4.0_Delegates_Lambda - Fatal编程技术网

C# 4.0 存储对要创建的对象的引用

C# 4.0 存储对要创建的对象的引用,c#-4.0,delegates,lambda,C# 4.0,Delegates,Lambda,我不知道这是否可能,所以这是一个在黑暗中拍摄 无论如何 考虑采用以下模型: Class Model { public List<string> TheList = null; } 类模型 { 公共列表列表=null; } 该列表被故意设置为空 var model = new Model(); command.RegisterInData( model => model.TheList ); // TheList is

我不知道这是否可能,所以这是一个在黑暗中拍摄

无论如何

考虑采用以下模型:

    Class Model
    {
        public List<string> TheList = null;
    }
类模型
{
公共列表列表=null;
}
该列表被故意设置为空

    var model = new Model();
    command.RegisterInData( model => model.TheList ); // TheList is null at this point

    model.TheList = new List<string>();
    model.TheList.Add("A value here");

    command.Execute(); // <-- Here I want to access the new list somehow
var模型=新模型();
command.RegisterInData(model=>model.TheList);//此时列表为空
model.TheList=新列表();
model.TheList.Add(“此处的值”);

command.Execute();// 懒惰在这里有用吗

懒惰在这里有用吗

您只需延迟调用传递给
RegisterInData
的委托,并在
Execute
处调用它(我猜),您只需延迟调用传递给
RegisterInData
的委托,并在
Execute
处调用它(我猜),这似乎是可行的。下面是一个更简单的访问器的变体:

class Command
{
    private Func<List<string>> listAccessor;

    public void RegisterInData(Func<List<string>> listAccessor)
    {
        this.listAccessor = listAccessor;
    }

    public void Execute()
    {
        var list = this.listAccessor();
        foreach (string s in list)
        {
            Console.Log(s);
        }
    }
}

// Elsewhere
var model = new Model();
command.RegisterInData(() => model.TheList);

model.TheList = new List<string>();
model.TheList.Add("A value here");

command.Execute();
class命令
{
私有函数列表访问器;
公共无效注册表项数据(Func listAccessor)
{
this.listAccessor=listAccessor;
}
public void Execute()
{
var list=this.listAccessor();
foreach(列表中的字符串s)
{
控制台日志;
}
}
}
//别处
var模型=新模型();
RegisterInData(()=>model.TheList);
model.TheList=新列表();
model.TheList.Add(“此处的值”);
command.Execute();

对于在执行之前未调用
RegisterInData
的情况,您可能需要错误处理,但您知道了。

这似乎是可行的。下面是一个更简单的访问器的变体:

class Command
{
    private Func<List<string>> listAccessor;

    public void RegisterInData(Func<List<string>> listAccessor)
    {
        this.listAccessor = listAccessor;
    }

    public void Execute()
    {
        var list = this.listAccessor();
        foreach (string s in list)
        {
            Console.Log(s);
        }
    }
}

// Elsewhere
var model = new Model();
command.RegisterInData(() => model.TheList);

model.TheList = new List<string>();
model.TheList.Add("A value here");

command.Execute();
class命令
{
私有函数列表访问器;
公共无效注册表项数据(Func listAccessor)
{
this.listAccessor=listAccessor;
}
public void Execute()
{
var list=this.listAccessor();
foreach(列表中的字符串s)
{
控制台日志;
}
}
}
//别处
var模型=新模型();
RegisterInData(()=>model.TheList);
model.TheList=新列表();
model.TheList.Add(“此处的值”);
command.Execute();

如果在
执行之前未调用
RegisterInData
,您可能需要错误处理,但您知道了RegisterInData的签名是什么。我已经偷看了林肯的分机。public void SetReference(Func谓词)。但是我得到了一个不能用用法推断的类型。@AnkMannen:请看Domenic的答案。RegisterInData的签名是什么。我已经偷看了林肯的分机。public void SetReference(Func谓词)。但我得到了一个无法用用法推断的答案。@AnkMannen:请看Domenic的答案。解决了它,但由于我显然是个新手,所以直到8小时后才能发布答案…:我解决了问题,但由于我显然是个新手,所以在8小时后才能发布答案…:D