在我的其他方法中,我可以做这样的事情,
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
}
}
}
答案 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 );