次のように、リフレクション API を使用して一部の WPF コントロールのプロパティの値をクエリする C++/CLI コードがあります。
Type ^t = ...;
Object ^o = ...;
PropertyInfo ^p = t->GetProperty( "Enabled" );
Object ^v = p->GetValue( o, nullptr );
これはうまくいきましたが、このコードを別のスレッドに移動する必要がありました。そうすることで、最後のGetValue
呼び出しで、別のスレッドからのオブジェクトへのアクセスが禁止されているという例外が生成されました。
私の WPF コントロールが DispatcherObjects であることを知っているので、それらに対して Invoke() を使用し、Action を渡して、コードの一部をターゲット オブジェクトと同じスレッドで実行できることを知っています。ただし、C++/CLI でこれを行う方法がわかりません。特に、関数 (つまり、引数を取り、値を返すもの) を渡すにはどうすればよいですか?
理想的には、次のようなことができます
// Toplevel code:
delegate Object ^GetPropertyDelegate( Object ^o, PropertyInfo ^p );
// Then, at the place where I perform the GetValue() call:
struct Local {
static Object ^run( Object ^o, PropertyInfo ^p ) {
return p->GetValue( o, nullptr );
}
};
Type ^t = ...;
Object ^o = ...;
PropertyInfo ^p = t->GetProperty( "Enabled" );
DispatcherObject ^dispObj = dynamic_cast<DispatcherObject ^>( o );
Object ^v = dispObj->Dispatcher->Invoke( gcnew GetPropertyDelegate( &Local::run ) );
技術的には、これはコンパイルされますが、意味がありません。理想的には、Dispatcher::Invoke に渡すことができるものとして、'o' と 'p' に対する軽量 (つまり、あまり多くのコードを必要としない) クロージャーを持ちたいと考えています。誰もこれを行う方法を知っていますか?