奇异递归模式,Curiously Recurring Template Pattern (CRTP) ,作用是能使父类中能够使用子类的信息。下面是我对这个问题的分析过程。

按照一般的继承关系,父类是无法访问到子类的,所以很自然的想到了c#中的泛型,将子类作为父类的泛型版本中的<T>,就能通过父类中的<T>来访问子类信息。

class App
{static void Main(){foreach (var str in DerivedA.NowClsMemberInfo){Console.WriteLine(str);}Console.ReadLine();}
}public class BaseA<T>
{public static IEnumerable<string> NowClsMemberInfo{get{foreach (var memberInfo in typeof (T).GetMembers()){yield return memberInfo.Name;}}}
}public class DerivedA : BaseA<DerivedA>
{public string StrA { get; set; }
}

DerivedA : BaseA<DerivedA>看着有些别扭,T1:BaseA<T2>中的T2,又要满足T2:BaseA<T3>,有点递归的意思。这里的T,我们是当作子类来用的,所以必须加一个约束,继承自父类,即:
public class BaseA<T> where T : BaseA<T>
{public static IEnumerable<string> NowClsMemberInfo{get{foreach (var memberInfo in typeof (T).GetMembers()){yield return memberInfo.Name;}}}
}

这是为了避免被人以比如BaseA<string>的形式调用,如果父类中的T(子类)用到了父类中的成员,类似于BaseA<string>的类就会出现编译错误,如:

public class BaseA<T>
{public static IEnumerable<string> NowClsMemberInfo{get{foreach (var memberInfo in typeof (T).GetMembers()){yield return memberInfo.Name;}}}public T InstanceNow { get; set; }public void DoSomething(){InstanceNow.DoSomething();}
}

所以:
public class BaseA<T> where T : BaseA<T>
{public static IEnumerable<string> NowClsMemberInfo{get{foreach (var memberInfo in typeof (T).GetMembers()){yield return memberInfo.Name;}}}public T InstanceNow { get; set; }public void DoSomething(){InstanceNow.DoSomething();}
}

参照的资料:

http://zpbappi.com/curiously-recurring-template-pattern-in-csharp/

https://www.zhihu.com/question/27421302

 

转载于:https://www.cnblogs.com/alongdada/p/7615233.html

c#中的奇异递归模式相关推荐

  1. 浅谈 CRTP:奇异递归模板模式

    浅谈 CRTP:奇异递归模板模式 前言 建议先看一遍文末的参考资料! 建议先看一遍文末的参考资料! 建议先看一遍文末的参考资料! 思维导图 一.CRTP 是什么 CRTP 全称 : Curiously ...

  2. 【C++】CRTP:奇异递归模板模式

    1. 什么是CRTP? 什么是CRTP?CRTP的全称是Curiously Recurring Template Pattern,即奇异递归模板模式,简称CRTP.CRTP是一种特殊的模板技术和使用方 ...

  3. C# 8的Ranges和递归模式

    \ 关键要点 \\ C# 8新增了Ranges和递归模式.\\t 可以使用Ranges来定义数据序列,可用于替代Enumberable.Range().\\t 递归模式为C#带来了类似F#的结构.\\ ...

  4. Go语言中常见的并发模式

    Go语言最吸引人的地方是它内建的并发支持.Go语言并发体系的理论是C.A.R Hoare在1978年提出的通信顺序进程(Communicating Sequential Process,CSP).CS ...

  5. 中序非递归遍历二叉树

    二叉树的递归算法虽然简单,但是会导致时间复杂度比较高,下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树,和元素类型为二叉树的栈 typedef struct BiTNode{TElemTyp ...

  6. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前, ...

  7. R语言使用str_replace函数和str_replace_all函数替换字符串中匹配到的模式:str_replace函数替换第一个匹配到的字符串、str_replace_all函数替换所有匹配到的

    R语言使用str_replace函数和str_replace_all函数替换字符串中匹配到的模式:str_replace函数替换第一个匹配到的字符串.str_replace_all函数替换所有匹配到的 ...

  8. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  9. 从脑电图(EEG)中提取稳定的模式进行识别

    本篇文章是论文<Identify Stable Patterns over Time for Emotion Recognition from EEG>(<从脑电图(EEG)中提取稳 ...

最新文章

  1. 阿里云python面试题_Python金典面试题
  2. Web.xml配置Error Page不能够转发的问题分析及解决
  3. IOS12上微信中点击不到表单的bug
  4. 机器学习入门系列(1)--机器学习概览(上)
  5. STL中map的使用要点
  6. 设计法则 - 菲茨定律 (转)
  7. ArrayList动态数组对象 c# 1231
  8. 【机器学习】集成学习--Bagging
  9. Linux中更新java代码命令,java代码执行linux命令
  10. Leap Motion 上手体验
  11. Pywinauto在Windows Twain Driver自动化测试中的应用研究
  12. 阿里云盘 PC 版上线,百度网盘 SVIP 功能全免费
  13. 基于QT和DCMTK的Dicom 图像浏览器---收尾二
  14. Android WebView下载使用教程
  15. 基于阿里云和Arduino的化学环境系统检测,支持钉钉机器人告警(MQ2、MQ3、MQ7、DHT11 完整源码以及实现步骤)
  16. word中常用技巧,快速删除word中光标前或后的内容
  17. 去雾算法学习-----Automatic recovery of the atmospheric light hazy image(fattal 大气光值自适应去雾算法)阅读笔记
  18. 鸢尾花的分类(四种方法)
  19. c# .net获取各国时间
  20. 软件工程 3:模块化设计

热门文章

  1. docker ubuntu 文件同步_Docker 的数据管理--Docker从入门到精通摘记
  2. 攻击防护手段_如何防护ddos流量攻击?
  3. Win11系统各个版本之间的比较,看完你就懂了!
  4. 数据库:MySQL常见的设计规范误区
  5. JS 中 call()、apply()、bind() 的用法
  6. 【基础】有关T-SQL的10个好习惯
  7. memcached 适用的场景
  8. html5 保存 搜索历史,html5 – 如何有效处理Dart中的浏览器历史记录(即后退按钮)?...
  9. 室内空气流动原理图_新风系统原理图—新风系统原理介绍
  10. 有一种爱情叫永不改变_设计就像爱情一样,总是在寻找一种方式