AssemblyCatalog简单操作
1,说明:
通过AssemblyCatalog,获得有特殊标记特性的类对象集合,通过类型获取单一对象,并实现不同对象同一操作的不同业务
2,引用System.ComponentModel.Composition
3,代码
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
internal abstract class AutoRegistryPolicy
{
/// <summary>
/// 类型
/// </summary>
protected abstract string Type { get; }
/// <summary>
/// 对象
/// </summary>
static List<AutoRegistryPolicy> _list = null;
static AutoRegistryPolicy()
{
//获取程序集中所有标记了特性([Export(typeof(AutoRegistryPolicy))])的对象
using (var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()))
using (var container = new CompositionContainer(catalog))
{
_list = container.GetExportedValues<AutoRegistryPolicy>().ToList();
}
}
/// <summary>
/// 根据类型获取对象
/// </summary>
/// <param name="methodType"></param>
/// <returns></returns>
static AutoRegistryPolicy GetPolicy(string methodType)
{
if (string.IsNullOrEmpty(methodType))
throw new Exception("");
AutoRegistryPolicy policy = _list.FirstOrDefault(p => p.Type == methodType);
if (policy == null)
{
throw new Exception("");
}
return policy;
}
/// <summary>
/// 操作
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
protected virtual string Registry(string request)
{
throw new Exception("");
}
/// <summary>
/// 对操作封装
/// </summary>
/// <param name="methodType">类型</param>
/// <param name="request">请求</param>
/// <returns></returns>
public static string RegistryPackage(string methodType, string request)
{
AutoRegistryPolicy policy = GetPolicy(methodType);
return policy.Registry(request);
}
}
internal sealed class CommonRegistryPolicy : AutoRegistryPolicy
{
[Export(typeof(AutoRegistryPolicy))]
public static readonly AutoRegistryPolicy Instance = new CommonRegistryPolicy();
protected override string Type { get { return "test1"; } }
protected override string Registry(string request)
{
return request;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
var autoregionresult = AutoRegistryPolicy.RegistryPackage("test1", "测试");
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构