views:

437

answers:

1

After an interop call, I get back a COM object. I know this object will be one of three possible COM classes (Class1, Class2, Class3), but do not know which one in runtime.

The reflection upon that object (interopObject.GetType()) returns the base RCW wrapper of System.__ComObject.

What I need is to set some properties on the object - Text1, Text2, ... Text30 (actual names, btw :)), which exist in all three classes.

So, the question is, can I somehow get the runtime type of the object (this would solve my problem, but might be impossible, as the .net runtime might not have that info), or can I set a property of a COM object blindly

this is my current code, which fails:

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 });
}


Thanks to Marc, these three go in my permanent gimmicks collection:

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);
}
+2  A: 

In C# 4.0, dynamic would be ideal for this type of duck-typing.

Until then, I wonder if VB.Net would be better, with Option Strict Off to allow late binding against object.

Worst case: write it in VB.Net, then use reflector to write the C# for you ;-p

Here's an example, that requires a reference to Microsoft.VisualBasic.dll, but is fine in C#:

public static object GetValue(object obj, string propertyName)
{
    return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null,
         propertyName, new object[0], null, null, null));
}
Marc Gravell
Unfortunalely, the code is due tomorrow, not sometime in the autumn/winter :)And also, VB is not an option.And yes, I do need duck-typing in a language that does not (yet) support it...
SWeko
Like I said; use reflector to get the C#, then... I'll try to do an example... (2 seconds)
Marc Gravell
Tried the NewLateBinding.LateGet magic, and it seems to works for now.Me happy.
SWeko
Checked around some more, and I love the dynamics of the NewLateBinding class. All hail Marc
SWeko