[C#] COM Interopでのリフレクションの使用


Answers

Question

interop呼び出しの後、私はCOMオブジェクトを返す。 私はこのオブジェクトが3つの可能なCOMクラス(Class1、Class2、Class3)のうちの1つになることは知っていますが、実行時にどのオブジェクトかわかりません。

そのオブジェクト(interopObject.GetType())に対するリフレクションは、System .__ ComObjectの基本RCWラッパーを返します。

私が必要とするのは、3つのクラスすべてに存在するText1、Text2、... Text30(実際の名前、btw :)というオブジェクトのプロパティを設定することです。

だから問題は、どういうわけか、オブジェクトの実行時の型を得ることができます(これは私の問題を解決しますが、.NETランタイムがその情報を持たないため不可能かもしれません)、またはCOMオブジェクトのプロパティを設定できますか盲目的に

これは私の現在のコードですが失敗します:

for ( int i = 1; i <= 30; i++ )
{
  ProprertyInfo pi =interopObject.GetType().GetProperty("Text" +i.ToString()) 
  // this returns null for pi
  pi.GetSetMethod().Invoke(interopObject, new object[] { someValue });
}

Marcのおかげで、これらの3つは私の永続的なギミックコレクションに入ります:

private static object LateGetValue(object obj, string propertyName)
{
  return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null,
            propertyName, new object[0], null, null, null));
}

private static void LateSetValue(object obj, string propertyName, object value)
{
  NewLateBinding.LateSet(obj, null, propertyName, new []{value}, null, null);
}

private static void LateCallMethod(object obj, string methodName)
{
  NewLateBinding.LateCall(obj, null, methodName, new object[0], null,
            null, null, true);
}