C# 如何将实例getter作为函数参数传递

C# 如何将实例getter作为函数参数传递,c#,lambda,C#,Lambda,我是C#的新手,请用外行术语解释,或者请指出我可以阅读和理解的相关文档 我有一个整数变量,定义如下: public int myCount => SomeList?.Count(p => !p.IsOnline) ?? 0; 我要做的是在函数调用中传递MyCount: ICommand myCommand = new DebouncedCommand(execute: async tcs => await myService.DoSomething(myCount)); 其

我是C#的新手,请用外行术语解释,或者请指出我可以阅读和理解的相关文档

我有一个整数变量,定义如下:

public int myCount => SomeList?.Count(p => !p.IsOnline) ?? 0;
我要做的是在函数调用中传递
MyCount

ICommand myCommand = new DebouncedCommand(execute: async tcs => await myService.DoSomething(myCount));
其中,
DoSomething
的签名为:

public async Task DoSomething(int myCount) { if (myCount <= 10) { .... } }
是实例获取者的简称。我希望将实例getter作为lambda或
Action
委托传递,而不是将
myCount
作为普通整数传递(这不起作用)


然而,作为一个新手,我不知道如何做到这一点。我的签名将如何更改?我如何在我的方法中使用它。i、 e.
if(myCount这取决于您在此未指定的部分。您的应用程序是多线程的吗

看看这个:

它之所以能工作,是因为对函数的调用再次发生,所以getter被重新评估

如果您有多线程,请告诉我,然后我将更新解决方案。

此语法

public int myCount=>;
这只是英语的简写

public int myCount{
得到{
... ;
}
}
因此,您的示例是获取myCount的当前值,它调用上面的
get
,然后将该int作为参数传递给该方法

myService.DoSomething(myCount);

您0计数的原因很可能是因为您没有显示代码。您显示的代码实现了您希望它能够完成的功能。我的最佳猜测是,您有另一个myCount局部变量或指向不同列表的局部SomeList。可能显式传递
this.myCount
会告诉您如果这是你不小心做的

回答问题的第二部分,你在追求一个Func而不是一个action

您的调用需要传入一个返回myCount的方法。以下是一种简单的方法:

        myService.DoSomething(()=>this.myCount);
方法签名需要接受返回int的方法,然后可以调用该Func上的Invoke()来获得结果

    public void DoSomething(Func<int> myCountFunc)
    { 
        if (myCountFunc.Invoke() <= 10) 
        {
        } 
    }
public void DoSomething(Func myCountFunc)
{ 

if(myCountFunc.Invoke()你确定
SomeList
不为空或有任何
IsOnline==true
的项吗?@JohanP是的。SomeList不断更新。因此,当SomeList有值时,即使count的值保持为0。是的。。它是多线程的。
DoSomething
的签名实际上是
公共异步任务DoSomething(
调用如下:
ICommand myCommand=new DebouncedCommand(执行:async tcs=>wait myService.DoSomething(myCount))
请参阅我对以下答案的评论,关于它是多线程的。你能更新你的问题以包含该结构吗?我已经更新了我的问题。对此表示歉意。我对C#非常陌生。我认为我的观点仍然成立。“当前”在执行
DoSomething
之前,将立即计算属性的值。这将在
DebouncedCommand
调用该执行参数时发生。在属性getter上放置一个断点并查看堆栈跟踪。“简化”删除大部分异步代码的示例。请注意编译的异步lamda如何访问属性
4\uu this.DoSomething(4\uu this.Value)
,正如您所期望的。我想这就是我要找的。谢谢。让我试试这个。
    public void DoSomething(Func<int> myCountFunc)
    { 
        if (myCountFunc.Invoke() <= 10) 
        {
        } 
    }