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

2023-11-30

.NET 4.5+ 中是否有类/API 允许将 C# 匿名类的实例公开为 COM 的后期绑定对象?例如。我想这样做:

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

并在 JavaScript 中使用它:

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

创建一个辅助类来包装匿名对象并通过以下方式公开其属性应该不是问题IReflect,但也许这样的东西已经存在了?只是不想重新发明轮子。


基于此,我编写了一个辅助类来实现它优秀的博客文章.

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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 C# 匿名类对象公开给 COM (JavaScript) 的相关文章

随机推荐

  • 使用 CVVideoCamera (OpenCV) 捕获 iOS 静态图像

    我在 iOS 上使用 opencv 2 4 9 并需要帮助 我想在拍摄高分辨率照片时使用 CVVideoCamera 进行捕捉 我需要用于过程图像方法的摄像机来通过边缘检测添加成熟的文档捕获 这也很好用 但是一旦检测到文档 我就需要一张已识
  • 在迭代向量时,如何改变向量中的另一个项,而不改变向量本身?

    我很清楚 迭代向量不应该让循环体任意改变向量 这可以防止迭代器失效 从而容易出现错误 然而 并非所有类型的突变都会导致迭代器失效 请参见以下示例 let mut my vec Vec
  • 如何列出某些流中的 ClearCase 活动?

    我想知道是否有一种方法可以指定在一个命令行调用中获取哪些流的 activitis 列表 现在 我正在使用以下任一方法基于 vob 或单个流构建活动列表 ct lsact invob vob name or ct lsact in strea
  • 如何删除oracle表的生成类型

    我有一个表 它使用 GENERATED ALWAYS AS IDENTITY 生成 id 列 创建脚本如下 CREATE Table DATA MIGRATION Test alter id INTEGER GENERATED ALWAYS
  • 如何使用 Select 导航到 URL?

    我想在带有选择框的网站上导航 当用户更改选择选项时 它会打开该选项的 url 这是我的选择
  • 我们如何在 Facebook 墙上发布 ASCII 艺术作品?

    在我的应用程序中 我需要将 iPhone 应用程序中的 ASCII 艺术作品发布到 Facebook 墙贴上 但我面临的问题是 Facebook 字体 Lucida Console 改变了我的 ASCII 艺术的格式 我在 Courier
  • 如何在android studio中更新gradle?

    我安装了Android Studio 0 1 9 今天我得到并更新到了0 2版本 当然我也更新了 安装后我重新启动了 Android Studio 但现在我收到以下消息 项目正在使用旧版本的 Android Gradle 插件 这 支持的最
  • 具有自定义形状导航栏的 UINavigationController

    我正在尝试创建一个具有自定义形状的自定义 UINavigationBar 如下所示 忽略透明度 正如您所看到的 这个 UINavigationBar 有一个自定义形状 我正在尝试复制它 环顾四周我发现这个回应 其中解释了我遵循的第一个步骤
  • 查找两个Python列表中常见项目的索引

    我在 python list A 和 list B 中有两个列表 我想找到它们共享的公共项 我这样做的代码如下 both for i in list A for j in list B if i j both append i 最后的com
  • 需要一些帮助来编译 jsoncpp 示例代码

    我正在尝试编译一个示例 jsoncpp 示例 但 标准 标头中显示了大量编译错误 有人在任何时候看到过这个吗 g g c json cc I usr local include json In file included from usr
  • IOS 应用程序崩溃,甚至没有输入我的代码

    最近 我的应用程序在没有输入代码的情况下开始崩溃 不确定发生了什么 我从 IOS 设备日志中获得了以下 c 信息 但我无法理解这一点 请有人帮助我找到应用程序崩溃的根本原因 当我安装临时版本时会发生这种情况 但如果我从调试安装应用程序 它工
  • 计算每行的单词数

    我正在尝试在 DataFrame 中创建一个新列 其中包含相应行的字数 我正在寻找单词的总数 而不是每个不同单词的频率 我以为会有一种简单 快速的方法来完成这个常见任务 但是在谷歌搜索并阅读了一些 SO 帖子之后 1 2 3 4 我被困住了
  • 如何运行实习生来测试使用node.js运行的dojo应用程序?

    我正在尝试使用 intern 来测试在 node js 下运行的 dojo 应用程序 我的 intern js 配置文件类似于 define loader packages name elenajs location lib name te
  • 如何获取ActionBlock的输入队列的访问权限?

    我正在传递给某个类的 Actionblock 实例 如果我打电话 cancellationSource Cancel 然后处理将停止 但有些实例可以留在ActionBlock的输入队列中 我需要访问剩余的实例才能释放一些资源 我怎样才能实现
  • functools.wraps 有什么作用?

    在对此的评论中回答另一个问题 有人说他们不确定什么functools wraps正在做 所以 我问这个问题是为了在 StackOverflow 上记录它以供将来参考 什么是functools wraps到底是做什么 当您使用装饰器时 您正在
  • 如何修复查看的 pdf 中非常小的栅格的不良插值(evince 和 chrome)

    我想为一些学术工作创建矩阵的可视化 我决定通过让图像中的像素对应于矩阵中的值来解决这个问题 我创建了如下漂亮的小 png 适当放大后 您会得到一个非常合理的图像 这是 inkscape 内的屏幕截图 然而 当我将其导出为 pdf 时 evi
  • 根据选择器选择显示自定义结账字段

    基于这个工作答案 显示或隐藏其他 Checkout 自定义字段的自定义下拉选择器 在 WooCommerce 结帐页面中 我使用下面的代码创建一些额外的自定义字段并对所有结帐字段重新排序 我使用 jQuery 脚本根据选择器选择显示 隐藏一
  • 处理选中的复选框 PHP

    我有一个从数据库中获取数据的表 如下所示 不是表单 if mysql num rows result echo table border 1 cellspacing 0 width 62 echo tr echo th width 15 T
  • 使用jquery获取div内容的值

    我有以下 html 我想获取 div 的值 即 Other 我怎样才能用 jQuery 做到这一点 div class readonly label Other div Use text 提取div的内容 var text field fu
  • 将 C# 匿名类对象公开给 COM (JavaScript)

    NET 4 5 中是否有类 API 允许将 C 匿名类的实例公开为 COM 的后期绑定对象 例如 我想这样做 webBrowser Document InvokeScript TestMethod new object new helloP