C#财产代表?

C#财产代表?,c#,delegates,C#,Delegates,在我的其他方法中,我可以做这样的事情 public void Add(T item) { if (dispatcher.CheckAccess()) { ... } else { dispatcher.Invoke(new Action<T>(Add), item); } } 公共作废添加(T项) { if(disp

在我的其他方法中,我可以做这样的事情

    public void Add(T item)
    {
        if (dispatcher.CheckAccess())
        {
            ...
        }
        else
        {
            dispatcher.Invoke(new Action<T>(Add), item);
        }
    }
公共作废添加(T项)
{
if(dispatcher.CheckAccess())
{
...
}
其他的
{
调用(新操作(添加),项);
}
}
但是在这种情况下,我如何调用属性呢

    public T this[int index]
    {
        get
        {
            ...
        }
        set
        {
            if (dispatcher.CheckAccess())
            {
                ...
            }
            else
            {
                dispatcher.Invoke(???, value, index); // <-- problem is here
            }
        }
    }
public T此[int索引]
{
得到
{
...
}
设置
{
if(dispatcher.CheckAccess())
{
...
}
其他的
{
dispatcher.Invoke(???,值,索引);//编辑:以下段落不再适用,因为OP的问题已被编辑

首先,您的第二个代码在逻辑上似乎不正确:您显然想调用setter,但当您为
索引提供一个值时,却没有提供实际的
值(即
)。我稍后将返回该问题


您可以将匿名委托或lambda函数包装在属性设置器周围,例如(使用匿名委托),以使其可调用:

dispatcher.Invoke(
    new Action<T>(  delegate (T item) { this[index] = item; }  ),
    item );

哎呀,忘了把
value
传回去了。我明天会试试。我想我可以这样做,但我记不起正确的语法。为什么要把项传递给代理而不是索引?如果没有必要传递索引,那么也不必传递项?
dispatcher.Invoke(new Action(()=>{this[index]=value;}));
通过查看您在问题中发布的代码,我假设
dispatcher.Invoke
需要一个
操作(即只有一个参数的委托)。但是,如果您可以传递两个参数,那么当然您也可以直接将
index
传递给代理。选择最适合您的方法!@Mark:添加了第三个带有双参数lambda函数的代码示例。太棒了。感谢您的帮助:)
dispatcher.Invoke(
    new Action<T>(  (T item) => { this[index] = item; }  ),
    item );
dispatcher.Invoke(
    new Action<int,T>(  (int index, T item) => { this[index] = item; }  ),
    index, item );