在我的其他方法中,我可以做这样的事情,
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)
编辑:以下段落不再适用,因为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)
| 归档时间: |
|
| 查看次数: |
3935 次 |
| 最近记录: |