Hi,
While using Reflection/Late binding, we can use some (extension) methods to make the code more readable than the :
GetType().InvokeMember(...)
With C# and Framework 3.5 or upper, we can write some extension methods so that the upper expression to ma make zoom extents become:
acad.Invoke("ZoomExtents");
or, to set the cursor size to 10:
acad.Get("Preferences").Get("Display").Set("CursorSize", 10);
public static class LateBinding
{
public static object Get(this object obj, string propName, params object[] parameter)
{
return obj.GetType().InvokeMember(propName, BindingFlags.GetProperty, null, obj, parameter);
}
public static void Set(this object obj, string propName, params object[] parameter)
{
obj.GetType().InvokeMember(propName, BindingFlags.SetProperty, null, obj, parameter);
}
public static object Invoke(this object obj, string methName, params object[] parameter)
{
return obj.GetType().InvokeMember(methName, BindingFlags.InvokeMethod, null, obj, parameter);
}
}
With F#, it's really easy to extend any Type, but ther's no way (AFAIK) to use optional parameters (as with params or ParamArray), but creating an array is so simple.
The zoom extents:
acad.invoke("ZoomExtents", null) |> ignore
The cursor to 10:
let size = acad.get("Preferences", null).get("Display", null).set("CursorSize", [| 10 |])
type Object with
member x.get(propName, parameter) =
x.GetType().InvokeMember(propName, BindingFlags.GetProperty, null, x, parameter)
member x.set(propName, parameter) =
x.GetType().InvokeMember(propName, BindingFlags.SetProperty, null, x, parameter)
|> ignore
member x.invoke (propName, parameter) =
x.GetType().InvokeMember(propName, BindingFlags.InvokeMethod, null, x, parameter)
VB do not allow to use extension methods with the Object Type, but we can define methods so that late binding expressions look like the vlax-get, vlax-put, and vlax,invoke LISP functions.
The zoom extents:
Invoke(acad, "ZoomExtents")
The cursor to 10:
SetProperty(GetProperty(GetProperty(acad, "Preferences"), "Display"), "CursorSize", 10)
Module LateBindingExtensions
Public Function GetProperty(ByVal obj As Object, ByVal propName As String, ByVal ParamArray parameter As Object()) As Object
Return obj.GetType().InvokeMember(propName, BindingFlags.GetProperty, Nothing, obj, parameter)
End Function
Public Sub SetProperty(ByVal obj As Object, ByVal propName As String, ByVal ParamArray parameter As Object())
obj.GetType().InvokeMember(propName, BindingFlags.SetProperty, Nothing, obj, parameter)
End Sub
Public Function Invoke(ByVal obj As Object, ByVal methName As String, ByVal ParamArray parameter As Object()) As Object
Return obj.GetType().InvokeMember(methName, BindingFlags.InvokeMethod, Nothing, obj, parameter)
End Function
End Module