C#属性委托?

mpe*_*pen 6 c# delegates

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

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

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

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

sta*_*ica 7

编辑:以下段落不再适用,因为OP的问题已被编辑.

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


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

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

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

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

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

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

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