C#属性委托?

时间:2010-05-09 07:10:05

标签: c# delegates

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

    public void Add(T item)
    {
        if (dispatcher.CheckAccess())
        {
            ...
        }
        else
        {
            dispatcher.Invoke(new Action<T>(Add), item);
        }
    }

但是如何针对这种情况调用属性?

    public T this[int index]
    {
        get
        {
            ...
        }
        set
        {
            if (dispatcher.CheckAccess())
            {
                ...
            }
            else
            {
                dispatcher.Invoke(???, value, index); // <-- problem is here
            }
        }
    }

1 个答案:

答案 0 :(得分:7)

修改:以下段落不再适用,因为OP的问题已经过编辑。

首先,您的第二个代码似乎逻辑错误:您显然想要调用setter,但是当您为index提供值时,您不提供实际value(即item)。我将在一秒钟内回到那个问题。


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

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

或(使用自C#语言版本3以来可用的lambda函数):

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

注意:您创建一个接受一个参数(item)的匿名委托或lambda函数。另一个必需参数(index)取自“外部”上下文。 (我想到了 closure 这个术语。)我认为这是你不必将dispatcher更改为有时用两个参数而不是一个参数调用的委托类型的唯一方法。

如果这不是问题,Invoke代码可能会更改为例如:

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