如何获取MEF中的所有方法

2024-03-21

我有属性类

[AttributeUsage(AttributeTargets.Method)]
public class MethodGetterAttribute : ExportAttribute
{

}

我在几个命名空间的方法中使用它:

namespace Model.First
{
    public class PersonBL
    {
        [MethodGetter]
        public void GetName(Person person)
        {

        }
    }
}

namespace Model.First.Second
{
    public class PersonBL
    {
        [MethodGetter]
        public void GetName(Person person)
        {

        }
    }
}

namespace Model.First.Second.Third
{
    public class WorkerBL
    {
        [MethodGetter]
        public void GetName(Worker worker)
        {

        }
    }
}

我想对所有方法进行排序并一一运行。为了获取方法,我正在这样做:

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(assemblies.FirstOrDefault(a => a.GetName().Name.Contains("Model"))));
var container = new CompositionContainer(catalog);
var importedMethods = container.GetExports<Action<Worker>>() as IEnumerable<Lazy<Action<Worker>>>;
var result = importedMethods.Select(a => a.Value.Target).ToList();// Here i'm getting only worker's method

但它只返回Worker的方法。我如何从工人那里获得所有三种方法?


出色地... 让我们创建4个类库

Zero.dll 以及其他程序集中使用的所有类

using System;
using System.ComponentModel.Composition;
using System.Diagnostics;

namespace Zero
{
    [AttributeUsage(AttributeTargets.Method)]
    public class MethodGetterAttribute : ExportAttribute { }

    public class Person { }

    public class Worker : Person { }

    public static class MethodHelper
    {
        public static string GetMethod()
        {
            var method = new StackTrace().GetFrame(1).GetMethod();
            return $"{method.DeclaringType.FullName} {method}";
        }
    }

    public static class Discovery
    {
        public static TDelegate[] GetDelegates<TAttribure, TDelegate>()
            where TAttribure : Attribute
            where TDelegate : Delegate
        {
            return Directory.GetFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "*.dll")
                            .Select(file => { try { return Assembly.LoadFrom(file); } catch { return null; } })
                            .OfType<Assembly>()
                            .Append(Assembly.GetEntryAssembly())
                            .SelectMany(assembly => assembly.GetTypes())
                            .SelectMany(type => type.GetMethods())
                            .Where(method => method.GetCustomAttributes(typeof(TAttribure)).Any())
                            .Select(method => Delegate.CreateDelegate(typeof(TDelegate), null, method, false))
                            .OfType<TDelegate>()
                            .ToArray();
        }
    }
}

Model.First.dll 引用 Zero.dll

using System;
using Zero;

namespace Model.First
{
    public class PersonBL
    {
        [MethodGetter]
        public void GetName(Person person)
        {
            Console.WriteLine(MethodHelper.GetMethod());
        }
    }
}

Model.First.Second.dll 引用 Zero.dll

using System;
using Zero;

namespace Model.First.Second
{
    public class PersonBL
    {
        [MethodGetter]
        public void GetName(Person person)
        {
            Console.WriteLine(MethodHelper.GetMethod());
        }

        [MethodGetter]
        public void Incompatible(string s)
        {
            Console.WriteLine(MethodHelper.GetMethod());
        }
    }
}

Model.First.Second.Third.dll 引用 Zero.dll

using System;
using Zero;

namespace Model.First.Second.Third
{
    public class WorkerBL
    {
        [MethodGetter]
        public void GetName(Worker worker)
        {
            Console.WriteLine(MethodHelper.GetMethod());
        }

        public void NoAttribute(Worker worker)
        {
            Console.WriteLine(MethodHelper.GetMethod());
        }
    }
}

然后让我们创建引用 Zero.dll、Model.First.dll、Model.First.Second.dll 和 Model.First.Second.Third.dll 的控制台应用程序 ConsoleApp.exe

using System;
using Zero;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var worker = new Worker();
            foreach (var d in Discovery.GetDelegates<MethodGetterAttribute, Action<Worker>>())
                d.Invoke(worker);
        }        
    }

    public class WorkerBL
    {
        [MethodGetter]
        public void GetName(Worker worker)
        {
            Console.WriteLine(MethodHelper.GetMethod());
        }
    }
}

让我们创建 Junk.txt,放一些废话,比如bd%E56#EVwD进入其中,将文件重命名为 Junk.dll 并将其添加到 .exe 文件目录中,然后启动应用程序。

输出是:

Model.First.PersonBL Void GetName(Zero.Person)
Model.First.Second.PersonBL Void GetName(Zero.Person)
Model.First.Second.Third.WorkerBL Void GetName(Zero.Worker)
ConsoleApp.WorkerBL Void GetName(Zero.Worker)

正如预期的那样。它查找具有指定属性的所有兼容方法并返回它们的委托。

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

如何获取MEF中的所有方法 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • django.db.utils.DataError:除以零

    我在以下代码行中收到错误 context stock margin context top stock annotate Avg purchase ExpressionWrapper F total puchase F quantity p
  • 第一个缩放事件删除中心变换

    我有一个像这样的 径向整齐树 https bl ocks org mbostock 4063550 https bl ocks org mbostock 4063550 我正在尝试添加缩放和平移 但我无法使缩放和平移正常工作 我的代码看起来
  • 在 JTree 上过滤[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Problem 对 a 应用过滤JTree以避免某些节点 叶子出现在渲染版本中JTree 理想情况下 我正在寻找一种允许动态过滤器的解决方案 但
  • React-native 在浏览器中打开链接并返回到应用程序

    我正在开发一个反应原生应用程序 它应该与支付网关进行通信 在完成支付过程 成功或失败 后 我需要向用户显示警报 为此 我打开了一个链接WebView之后我得到了 return 的 urlonNavigationStateChange并显示成
  • 一个程序如何控制另一个程序?

    机器人 它们是如何工作的 他们是否告诉视频游戏按下了某个键或点击了鼠标 如果没有 有没有办法让你的程序告诉另一个程序按下了一个键 我想制作一个程序来击败一些游戏 因此 任何资源或示例都值得赞赏 Update 因此一种方法是模拟击键 那么有哪
  • Javascript 中的“柯里化”和“组合”是同一概念吗?

    最近我在一本 Javascript 书中读到了有关函数组合的内容 然后在一个网站上我看到有人将其称为柯里化 它们是同一个概念吗 Omarjmh 的答案很好 但在我看来 撰写示例对于学习者来说极其复杂 它们是同一个概念吗 No 首先 柯里化是
  • 如何在Python中建立和求解联立方程

    对于固定整数n 我有一组2 n 1 联立方程如下 M p 1 n p 1 n M n 1 2 n N p 1 p 1 n M p 1 N p 1 n p 1 n M n 1 p n N p 1 M 1 1 n 2 n M n 1 2 n N
  • 如何编写一个正则表达式来匹配任意顺序的字符?

    我正在尝试编写一个正则表达式来匹配一组字符 而不考虑顺序 例如 str act str scan Insert expression here 将匹配 cat act tca atc tac cta 但不匹配ca ac or cata 我在
  • 从 IPHostEntry 获取有效 IP

    我尝试使用此方法获取我的计算机的 IP 地址 var ipadd Dns GetHostEntry Dns GetHostName foreach var ipAddress in ipadd AddressList Console Wri
  • javascript 中剩余参数和展开运算符的用法

    ECMAScript 6中添加的rest参数有什么用 例如 在 ECMAScript 5 中 您可以执行以下操作来获取从第二个元素开始的参数数组 ES 5 store Joe money store Jane letters certifi
  • 根据 UICollectionView 中的图像动态更改单元格大小

    我正在水平集合视图中显示从服务器接收的动态图像 当我设置集合视图时 我设置了 void setupCollectionView self setupPageControlView self screensCollectionView del
  • 提高识别率的图像预处理步骤

    我正在为我的项目使用 TessBaseAPI 制作一个简单的 OCR Android 应用程序 我已经完成了一些图像预处理步骤 例如二值化和图像增强 但他们的结果是50 到60 怎样才能提高识别率呢 我包括两个示例图像 http image
  • 关于Environment.ProcessorCount的问题

    我很好奇 NET 属性是什么Environment ProcessorCount实际上返回 它返回核心数量 处理器数量还是两者都返回 如果我的计算机有 2 个处理器 每个处理器有 4 个核心 Environment ProcessorCou
  • 如何计算 React Native/JS 中 JSON 响应的长度?

    我想计算我的响应 JSON 的长度 这是我的代码 getMoviesFromApiAsync return fetch http sampleurl com CommonDataManager getInstance getUserID t
  • Android:当应用程序被终止时从服务启动活动

    在我的应用程序中 我有一个Service在后台 和前台 运行 In this Service 有一个CountdownTimer当它完成时 我想在某个特定的时间启动该应用程序Activity并在中做一些事情Activity自动 并且即使我的
  • 如何在 VS Code 中跨多个文件执行命令?

    我想通过运行一些命令来优化我的打字稿代码 例如resolve organizeImports我的所有打字稿 ts 文件中都带有 TS Hero 插件 逐个文件地执行此操作可能非常烦人且耗时 有没有一种简单的方法来进行这种 批量 执行 我已经
  • Moment.js 月份差异

    我已经使用 moment js 有一段时间了 它使日期操作变得更加容易 但我有一个失败的特定案例 我不明白为什么 计算今天 2013 年 10 月 31 日 和 2014 年 2 月 1 日之间的差异时 月份差异返回为 2 尽管两个日期之间
  • JQuery:获取不包括嵌套标签的标签内容

    我有一些如下所示的 HTML span Text I m interested in span Other crap I don t care about span span 我希望获取跨度 A 的文本内容 不包括任何嵌套标签 即上例中跨度
  • Nestjs Mongoose 服务的单元测试

    我一直在试图弄清楚如何对 NestJS 服务进行单元测试 所以我写了一个规范文件来测试这些使用 mongoose 和 jest 的 NestJS 服务 规格文件如下 import Test TestingModule from nestjs
  • 如何获取MEF中的所有方法

    我有属性类 AttributeUsage AttributeTargets Method public class MethodGetterAttribute ExportAttribute 我在几个命名空间的方法中使用它 namespac