Advertisement
Noseratio

SO-18633071

Sep 5th, 2013
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.10 KB | None | 0 0
  1. // http://stackoverflow.com/questions/18633071/exposing-c-sharp-anonymous-class-objects-to-com-javascript
  2.  
  3. /// <summary>
  4. /// Reflecting a C# object for interfacing with JavaScript
  5. /// http://blogs.msdn.com/b/shrib/archive/2007/09/04/ireflect-and-idispatch.aspx
  6. /// E.g.:
  7. /// webBrowser.Document.InvokeScript("TestMethod", new object[] { new Reflector(new { helloProperty = "Hello!", byeProperty = "Bye!" }) });
  8. /// </summary>
  9. [ComVisible(true), ClassInterface(ClassInterfaceType.None)]
  10. public class Reflector :
  11.     System.Reflection.IReflect
  12. {
  13.     object _target;
  14.  
  15.     protected Reflector() { }
  16.  
  17.     public Reflector(object target)
  18.     {
  19.         Debug.Assert(target != null);
  20.         _target = target;
  21.     }
  22.  
  23.     public object Target
  24.     {
  25.         get { return _target; }
  26.     }
  27.  
  28.     #region IReflect
  29.  
  30.     public FieldInfo GetField(string name, BindingFlags bindingAttr)
  31.     {
  32.         return this._target.GetType().GetField(name, bindingAttr);
  33.     }
  34.  
  35.     public FieldInfo[] GetFields(BindingFlags bindingAttr)
  36.     {
  37.         return this._target.GetType().GetFields(bindingAttr);
  38.     }
  39.  
  40.     public MemberInfo[] GetMember(string name, BindingFlags bindingAttr)
  41.     {
  42.         return this._target.GetType().GetMember(name, bindingAttr);
  43.     }
  44.  
  45.     public MemberInfo[] GetMembers(BindingFlags bindingAttr)
  46.     {
  47.         return this._target.GetType().GetMembers(bindingAttr);
  48.     }
  49.  
  50.     public MethodInfo GetMethod(string name, BindingFlags bindingAttr)
  51.     {
  52.         return this._target.GetType().GetMethod(name, bindingAttr);
  53.     }
  54.  
  55.     public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers)
  56.     {
  57.         return this._target.GetType().GetMethod(name, bindingAttr, binder, types, modifiers);
  58.     }
  59.  
  60.     public MethodInfo[] GetMethods(BindingFlags bindingAttr)
  61.     {
  62.         return this._target.GetType().GetMethods(bindingAttr);
  63.     }
  64.  
  65.     public PropertyInfo[] GetProperties(BindingFlags bindingAttr)
  66.     {
  67.         return _target.GetType().GetProperties(bindingAttr);
  68.     }
  69.  
  70.     public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
  71.     {
  72.         return this._target.GetType().GetProperty(name, bindingAttr, binder, returnType, types, modifiers);
  73.     }
  74.  
  75.     public PropertyInfo GetProperty(string name, BindingFlags bindingAttr)
  76.     {
  77.         return this._target.GetType().GetProperty(name, bindingAttr);
  78.     }
  79.  
  80.     public object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters)
  81.     {
  82.         if (target == this)
  83.         {
  84.             if (name.CompareTo("[DISPID=0]") == 0)
  85.             {
  86.                 if (invokeAttr.HasFlag(BindingFlags.InvokeMethod))
  87.                     return this._target;
  88.                 else if (invokeAttr.HasFlag(BindingFlags.GetProperty) && args.Length == 0)
  89.                     return this._target.GetType().ToString();
  90.             }
  91.             else
  92.             {
  93.                 return this._target.GetType().InvokeMember(name, invokeAttr, binder, _target, args, modifiers, culture, namedParameters);
  94.             }
  95.         }
  96.         throw new ArgumentException();
  97.     }
  98.  
  99.     public Type UnderlyingSystemType
  100.     {
  101.         get { return this._target.GetType().UnderlyingSystemType; }
  102.     }
  103.  
  104.     #endregion
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement