1

次のように、リフレクション 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' に対する軽量 (つまり、あまり多くのコードを必要としない) クロージャーを持ちたいと考えています。誰もこれを行う方法を知っていますか?

4

1 に答える 1

1

次のようなものが機能するはずです。デリゲートを使用しFunc<T1, T1, TResult>て静的メソッドを呼び出します。メソッドの引数が呼び出しに渡されDispatcher.Invokeます。

public ref class YourClass
{
private:
    static Object^ GetValue(Object^ queryObject, PropertyInfo^ queryProperty)
    {
        return queryProperty->GetValue(queryObject);
    }

public:
    static Object^ GetPropertyValue(
        DispatcherObject^ dispObj, PropertyInfo^ propertyInfo)
    {
        return dispObj->Dispatcher->Invoke(
            gcnew Func<Object^, PropertyInfo^, Object^>(&YourClass::GetValue),
            dispObj, propertyInfo);
    }
};

次のコードは、静的メソッドをまったく必要としません。インスタンスとメソッドFunc<Object^, Object^>からデリゲートを直接作成します。有効な C++/CLI かどうかはわかりませんが、私にとっては問題なく動作します。PropertyInfoPropertyInfo::GetValue

Object^ result = dispObj->Dispatcher->Invoke(
    gcnew Func<Object^, Object^>(propertyInfo, &PropertyInfo::GetValue), dispObj);
于 2013-07-16T13:33:48.563 に答える