背景

"有没有遇见这样一个场景,需要注入到浏览器的类太多,又想统一管理且不遗漏,有没有什么好办法?"
”有有有,把头伸过来~“

解决办法

第一步:提供一个[Attribute]

既然要知道哪些类需要被浏览器,那么可以使用[Attribute]进行标记。

首先我们提供一个[Attribute],
第一个原因是 考虑到cefsharp是不支持同一个类名注入的,所以使用[Attribute]也能方便取名,以便于防止重名事情发生。

其次,如果不想要注入,可以直接移除[Attribute]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class JSBridgeAttribute : Attribute
{
/// <summary>
/// js中服务名称
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public bool IsAsync { get; set; } = true; public JSBridgeAttribute()
{ } public JSBridgeAttribute(string name, bool isAsync = true)
{
this.Name = name;
this.IsAsync = isAsync;
}
}

有了这个,可以在你想要的class上进行标记,这样就表示,存在一个 FooService,可以调用里面的方法sum

[JSBridgeAttribute("FooService")]
public class Foo
{
public int sum(int x,int y)
{
return x + y;
}
}

第二步:在浏览器里面加入标记JSBridge类

因为要找到全部的标记JSBridge类,可以通过程序集反射得到,(考虑到这个过程耗时,要得到所有的类都加载完毕再打开浏览器,因此加上_initDll.Wait()

注意:存在某种情况找不到程序集,可能因为该程序集并没有在主程序中有过调用

/// <summary>
/// 扩展全局注入js
/// </summary>
public static class BrowserExtend
{
private static readonly List<Type> TypeCache = new List<Type>(); private static Task _initDll; /// <summary>
/// 初始化所有的DLL带JSBridgeAttribute的类
/// </summary>
public static Task InitDllTask()
{
_initDll = Task.Run(()=>
{
var list = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in list)
{
foreach (var type in GetTypesWithHelpAttribute(assembly))
{
TypeCache.Add(type);
}
}
}); return _initDll;
} public static void InjectBridgeObject(this BaseBrowser baseBrowser)
{
_initDll.Wait(); foreach (var type in TypeCache)
{
var item = Activator.CreateInstance(type);
var attribute = item.GetType().GetCustomAttributes(typeof(JSBridgeAttribute), false).FirstOrDefault() as JSBridgeAttribute;
string name = item.GetType().Name;
if (attribute != null)
{
name = attribute.Name;
}
baseBrowser.RegisterJsObject(name, item, true);
}
} private static IEnumerable<Type> GetTypesWithHelpAttribute(Assembly assembly)
{
foreach (Type type in assembly.GetTypes())
{
if (type.GetCustomAttributes(typeof(JSBridgeAttribute), true).Length > 0)
{
yield return type;
}
}
}
}

最后,在App.xaml.cs或者其他地方,使用 BrowserExtend.InitDllTask();

C# Cefsharp 如何利用[Attribute]的把C#中的方法给到浏览器中调用的更多相关文章

  1. C#利用Attribute实现简易AOP介绍

    首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...

  2. C#当中利用Attribute实现简易AOP

    首先看一段简单的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } //来自UI层的调用 ...

  3. .Net core 2.0 利用Attribute获取MVC Action来生成菜单

    最近在学习.net core的同时将老师的MVC5项目中的模块搬过来用,其中有一块就是利用Attribute来生成菜单. 一·首先定义Action实体 /// <summary> /// ...

  4. 利用yum下载软件包的三种方法

    转自:http://297020555.blog.51cto.com/1396304/530703 方法一: downloadonly插件 有一个yum的插件叫做downloadonly,顾名思义,就 ...

  5. 利用navigator对象在浏览器中检查插件

    利用navigator对象在浏览器中检查插件,实现的代码如下. // IE4+.firefox.chrome.safari.opera中,利用navigator检测插件 ,name为插件的名字 fun ...

  6. 利用反射及JDBC元数据编写通用查询方法

    元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...

  7. 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据

    利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...

  8. 利用GBDT模型构造新特征具体方法

    利用GBDT模型构造新特征具体方法 数据挖掘入门与实战  公众号: datadw   实际问题中,可直接用于机器学**模型的特征往往并不多.能否从"混乱"的原始log中挖掘到有用的 ...

  9. C# 利用位运算传递多个参数方法

    前言 在工作中用sendMessage的方法向另外一个进程中传递窗体的位置,长度,宽度四个值,但是sendMessage的方法签名中只有两个参数.于是在网上找到了一些代码,找到了这个利用位运算来合并参 ...

  10. 利用Linux系统生成随机密码的10种方法【转】

    Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法. 1. 使用SHA算法来加密日期,并输出结 ...

随机推荐

  1. .Net Core5.0中Autofac依赖注入整合多层,项目中可直接用

    一.配置Autofac替换内置DI 1.安装Nuget包:Autofac,Autofac.Extensions.DependencyInjection 2.Program.cs中CreateHostB ...

  2. kafka事务流程

    流程 kafka事务使用的5个API // 1. 初始化事务 void initTransactions(); // 2. 开启事务 void beginTransaction() throws Pr ...

  3. scab2

    package com.cmb.cox.utils;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;im ...

  4. shell脚本获取函数返回值

    方式1 原理:return返回的值可以通过$?得到. 缺点:return只能返回整数 #!/bin/sh function test() { return 100 } test echo $? 方式2 ...

  5. NB-IoT,LoRA,WIFI,蓝牙,Zigbee,MQTT,CoAP之间的关系

    --- title: file_name date: 2020-06-22 07:26:20 categories: tags: - iot - wifi - Bluetooth - MQTT - c ...

  6. 【论文阅读】TRO2022: A Two-Stage Optimization-Based Motion Planner for Safe Urban Driving

    TRO2022: A Two-Stage Optimization-Based Motion Planner for Safe Urban Driving Summary: 探讨planning过程中 ...

  7. ComfyUI进阶篇:ComfyUI核心节点(三)

    ComfyUI核心节点(三) 前言: 学习ComfyUI是一场持久战.当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点.面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措. ...

  8. JavaWeb踩坑记录

    org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found. 或 There is no getter for pro ...

  9. Spring 获取Bean ApplicationContextAware的使用

    创建类继承ApplicationContextAware package net.ybclass.online_ybclass.utils; import org.springframework.be ...

  10. Django 自带忘记密码,密码重置功能

    registration/password_reset_form.html: 重置密码表单模板 registration/password_reset_email.html: 发送重置密码邮件模板 r ...