1. 定义抽象方法

public abstract class BaseProcesser
    {
        public abstract void GetCustomerReportCardDetailInfo(CustomerReportCardRequest request, ReportCardResult response);
    }

2. 所有Processor都继承自BaseProcessor

public class GiftProcesser : BaseProcesser
    {
        public override void GetCustomerReportCardDetailInfo(CustomerReportCardRequest request, ReportCardResult response)
        {
            response.GiftInfo = GiftAccessor.GetGiftInfo(request);
        }
    }

3.将Processor的名称配置起来,通过反射动态加载去执行

4.具体示例如下:

 public static CustomerReportCardResponse GetCustomerReportCardInfo(CustomerReportCardRequest request, string view, string[] expand)
{
ReportCardResult result = new ReportCardResult();
List<string> currencyCodes = new List<string>();
if (view == "DETAIL")
{
if (!CheckCurrencyCode(request, ref currencyCodes))
{
return null;
} IEnumerable<string> processKeys = AllProcessers.Where(n => expand.Contains(n.Key)).Select(n => n.Key);
foreach (var key in processKeys)
{
var processer = AllProcessers[key];
processer.GetCustomerReportCardDetailInfo(request, result);
}
}
return SetCustomerReportCardResponse(result, request, currencyCodes);
} private static Dictionary<string, BaseProcesser> allProcessers = null;
private static Dictionary<string, BaseProcesser> AllProcessers
{
get
{
if (allProcessers == null)
{
allProcessers = new Dictionary<string, BaseProcesser>();
Dictionary<string, string> classNames = GetResource(); foreach (var key in classNames.Keys)
{
BaseProcesser detail = typeof(BaseProcesser).Assembly.CreateInstance(classNames[key]) as BaseProcesser;
if (detail == null) continue; if (!allProcessers.ContainsKey(key))
{
allProcessers.Add(key, detail);
}
}
}
return allProcessers;
}
} private static Dictionary<string, string> GetResource()
{
Dictionary<string, string> result = new Dictionary<string, string>();
PerKeyValue keyValue = ConfigContainer.KeyValuesConfig["CustomerReportCardExpand"];
if (keyValue == null) return null; PerKeyValueCollection keyValues = keyValue.KeyValues;
string assemblyBase = keyValue.Attributes["Class"].Value; foreach (PerKeyValue resource in keyValues)
{
if (resource == null) continue; result.Add(resource.Name, assemblyBase + "." + resource.Value);
}
return result;
}

  

反射动态创建不同的Processor的更多相关文章

  1. StructureMap.dll 中的 GetInstance 重载 + 如何利用 反射动态创建泛型类

    public static T GetInstance<T>(ExplicitArguments args); // // Summary: // Creates a new instan ...

  2. C#反射动态创建实例并调用方法

    在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...

  3. .Net 中的反射(动态创建类型实例) - Part.4

    动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...

  4. .Net 中的反射(动态创建类型实例)

    动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...

  5. OC 反射-->动态创建类

    系统方法 NSLog(@"%s", __func__); //打印出类的方法名称,如: //打印结果:2018-02-22 10:52:15.394575+0800 DemoRun ...

  6. C# 学习笔记(一) Winform利用Assembly反射动态创建窗体

    1. 添加Reflection //添加对Reflection程序集引用 using System.Reflection; // 引用窗体创建方法CreateForm,传入参数 private voi ...

  7. c#反射动态创建窗体

    根据窗体的名称动态创建窗体 Assembly assembly = Assembly.GetExecutingAssembly();             // 实例化窗体 try { Form f ...

  8. C#根据反射动态创建ShowDoc接口文本信息

    我目前每天主要工作以开发api为主,这都离不开接口文档.如果远程对接的话前端总说Swagger不清晰,只能重新找一下新的接口文档.ShowDoc就是一个不错的选择,简洁.大方.灵活部署. 但是话说回来 ...

  9. C#——反射动态创建类的实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...

随机推荐

  1. halcon中variation_model_single实例注释.

    * This example shows how to employ the new extensions of HALCON's variation model operators* to perf ...

  2. OGG-03517 Conversion from character set failed解决方法

    用goldengate同步oracle数据到mysql,由于一个字段某行数据的字段集的原因导致 replicat进程报 OGG-03517错 OGG-03517  Conversion from ch ...

  3. Linux 输出文件列数,拼接文件

    如果我只想看看文件的前几行,每行的字段数(列数),我的文件已tab作为分隔符(这个可以自己指定),其具体命令如下: head fileName | awk -F'\t' '{print NF}' 如果 ...

  4. 通过js看类似C#中的回掉

    我认为并行有两种形式,第一种是异步,第二种是多线程,目的都是为了实现并行,只不过异步和多线程都是手段而已 第一种异步 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过 ...

  5. Tomcat抛出异常:ClientAbortException: java.net.SocketException: Connection

    在做一个小网站的时候,写了一个通过servlet实现文件下载功能的页面.当我点击超级练级,弹出下载对话框,点击保存正常下载,不会出现任何问题,当我我点击取消,服务器端就出现如下提示: ClientAb ...

  6. LoadRunner11.52发布,全新的VTS

    LoadRunner11.52发布,全新的VTShttp://automationqa.com/forum.php?mod=viewthread&tid=2252&fromuid=2 ...

  7. 解决ubuntu解压zip文件名乱码的问题

    1. 安装7-zip 和 convmv : 命令: sudo apt-get install convmv p7zip-full 2. 解压zip文件: 命令:LANG=C 7z e yourZIPf ...

  8. 给MySQL官方提交的bug report备忘

    1.  Bug #72215 When LOCK_plugin conflicts very much, one uninstall-audit-plugin operation crash  htt ...

  9. Android开发在路上:少去踩坑,多走捷径

    转自:http://djt.qq.com/article/view/1193   最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, ...

  10. 关于Parallel.For/Foreach并行方法中的localInit, body, localFinally使用

    对集合成员的操作往往可以通过并行来提高效率,.NET Parallel类提供了简单的方法来帮助我们实现这种并行,比如Paralle.For/ForEach/Invoke方法. 其中,For/ForEa ...