简体   繁体   English

将c#匿名类对象公开给COM(JavaScript)

[英]Exposing c# anonymous class objects to COM (JavaScript)

Is there a class/API in .NET 4.5+ allowing to expose an instance of C# anonymous class as as late-bound object to COM? .NET 4.5+中是否有类/ API允许将C#匿名类的实例公开为COM的后期绑定对象? Eg I want do this: 我想这样做:

webBrowser.Document.InvokeScript("TestMethod", new object[] { 
    new { 
        helloProperty = "Hello!", 
        byeProperty = "Bye!"  
    }
});

and use it in JavaScript: 并在JavaScript中使用它:

function TestMethod(obj)
{
    alert(obj.helloProperty + ", " + obj.byeProperty);
}

It should not be a problem to create a helper class to wrap the anonymous object and expose its properties via IReflect , but perhaps, something like this already exists? 创建一个帮助器类来包装匿名对象并通过IReflect公开它的属性应该不是问题,但也许这样的东西已经存在了? Just don't want to reinvent the wheel. 只是不想重新发明轮子。

I've cooked up a helper class to make it happen, based on this excellent blog post . 基于这篇优秀的博客文章 ,我已经制作了一个辅助课程来实现它。

Usage: 用法:

webBrowser.Document.InvokeScript("TestMethod", new object[] { 
    new Reflector(new { helloProperty = "Hello!", byeProperty = "Bye!" }) });

Code: 码:

[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
public class Reflector :
    System.Reflection.IReflect
{
    object _target;

    protected Reflector() { }

    public Reflector(object target)
    {
        Debug.Assert(target != null);
        _target = target;
    }

    public object Target
    {
        get { return _target; }
    }

    #region IReflect

    public FieldInfo GetField(string name, BindingFlags bindingAttr)
    {
        return this._target.GetType().GetField(name, bindingAttr);
    }

    public FieldInfo[] GetFields(BindingFlags bindingAttr)
    {
        return this._target.GetType().GetFields(bindingAttr);
    }

    public MemberInfo[] GetMember(string name, BindingFlags bindingAttr)
    {
        return this._target.GetType().GetMember(name, bindingAttr);
    }

    public MemberInfo[] GetMembers(BindingFlags bindingAttr)
    {
        return this._target.GetType().GetMembers(bindingAttr);
    }

    public MethodInfo GetMethod(string name, BindingFlags bindingAttr)
    {
        return this._target.GetType().GetMethod(name, bindingAttr);
    }

    public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers)
    {
        return this._target.GetType().GetMethod(name, bindingAttr, binder, types, modifiers);
    }

    public MethodInfo[] GetMethods(BindingFlags bindingAttr)
    {
        return this._target.GetType().GetMethods(bindingAttr);
    }

    public PropertyInfo[] GetProperties(BindingFlags bindingAttr)
    {
        return _target.GetType().GetProperties(bindingAttr);
    }

    public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
    {
        return this._target.GetType().GetProperty(name, bindingAttr, binder, returnType, types, modifiers);
    }

    public PropertyInfo GetProperty(string name, BindingFlags bindingAttr)
    {
        return this._target.GetType().GetProperty(name, bindingAttr);
    }

    public object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters)
    {
        if (target == this)
        {
            if (name.CompareTo("[DISPID=0]") == 0)
            {
                if (invokeAttr.HasFlag(BindingFlags.InvokeMethod))
                    return this._target;
                else if (invokeAttr.HasFlag(BindingFlags.GetProperty) && args.Length == 0)
                    return this._target.ToString();
            }
            else
            {
                return this._target.GetType().InvokeMember(name, invokeAttr, binder, _target, args, modifiers, culture, namedParameters);
            }
        }
        throw new ArgumentException();
    }

    public Type UnderlyingSystemType
    {
        get { return this._target.GetType().UnderlyingSystemType; }
    }

    #endregion
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM