常规用法:

  1. Type t = sender.GetType();
  2. if (t == typeof(Button)) {
  3. var realObj = (Button)sender;
  4. // Do Something
  5. }
  6. else if (t == typeof(CheckBox)) {
  7. var realObj = (CheckBox)sender;
  8. // Do something else
  9. }
  10. else {
  11. // Default action
  12. }

非常规方法一:

  1. TypeSwitch.Do(
  2. sender,
  3. TypeSwitch.Case<Button>(() => textBox1.Text = "Hit a Button"),
  4. TypeSwitch.Case<CheckBox>(x => textBox1.Text = "Checkbox is " + x.Checked),
  5. TypeSwitch.Default(() => textBox1.Text = "Not sure what is hovered over"));

  1.  
  1. 相应的静态类
  1. static class TypeSwitch {
  2. public class CaseInfo {
  3. public bool IsDefault { get; set; }
  4. public Type Target { get; set; }
  5. public Action<object> Action { get; set; }
  6. }
  7.  
  8. public static void Do(object source, params CaseInfo[] cases) {
  9. var type = source.GetType();
  10. foreach (var entry in cases) {
  11. if (entry.IsDefault || type == entry.Target) {
  12. entry.Action(source);
  13. break;
  14. }
  15. }
  16. }
  17.  
  18. public static CaseInfo Case<T>(Action action) {
  19. return new CaseInfo() {
  20. Action = x => action(),
  21. Target = typeof(T)
  22. };
  23. }
  24.  
  25. public static CaseInfo Case<T>(Action<T> action) {
  26. return new CaseInfo() {
  27. Action = (x) => action((T)x),
  28. Target = typeof(T)
  29. };
  30. }
  31.  
  32. public static CaseInfo Default(Action action) {
  33. return new CaseInfo() {
  34. Action = x => action(),
  35. IsDefault = true
  36. };
  37. }
  38. }



方法二:

  1. 定义:var @switch = new Dictionary<Type, Action> {
  2. { typeof(Type1), () => ... },
  3. { typeof(Type2), () => ... },
  4. { typeof(Type3), () => ... },
  5. };
  1. @switch[typeof(MyType)]();

使用:

  1. if(@switch.ContainsKey(typeof(MyType))) {
  2. @switch[typeof(MyType)]();
  3. }


C# Switch is Type的更多相关文章

  1. jq塞入不同状态html的写法 switch (defaults.type)

    (function($) { //生成一个block function createBlock(options) { var defaults = { type: "1", } v ...

  2. switch..case使用

    1.多个if...else连在一起使用的时候,可以转为使用更方便的switch结构.switch (XXX) { case "aaa": // ... break; case &q ...

  3. JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-005控制类型映射(Nationalized、@LOB、@org.hibernate.annotations.Type)

    一.简介 1. 2. 3. 4. to override this default mapping. The JPA specification has a convenient shortcut a ...

  4. 《Go学习笔记 . 雨痕》流程控制(if、switch、for range、goto、continue、break)

    Go 精简(合并)了流控制语句,虽然某些时候不够便捷,但够用. if...else... 条件表达式值必须是布尔类型,可省略括号,且左花括号不能另起一行. func main() { x := 3 i ...

  5. bootstrap switch样式修改与多列等间距布局

    先以一张图开启今天的随笔 今天实习遇到了switch按钮,小姐姐说用插件bootstrap switch来写,我第一次用这个插件,首先在引入方面就遇到了很多坑,先来总结一下bootstrap swit ...

  6. 微信小程序组件switch

    表单组件switch:官方文档 Demo Code: Page({ switch1Change: function (e){ console.log('switch1 发生 change 事件,携带值 ...

  7. [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法

    最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ...

  8. 纯css实现 switch开关

    <!-- 直接看代码,利用了css3兄弟选择器 --><!-- html --> <button class="switch"> <inp ...

  9. 解决Layui的switch样式显示问题

    Layui官方文档是这么说的: <input type="checkbox" name="xxx" lay-skin="switch" ...

随机推荐

  1. OpenStack Mixture HypervisorsDriver configure and implementation theory

    通过本文,您将可以了解在 OpenStack 中如何进行混合 Hypervisor 的配置及其实现原理的基本分析.本文主要结合作者在 Nova 中的实际开发经验对 OpenStack 中混合 Hype ...

  2. 我的Android进阶之旅------>Android拍照小例子

    今天简单的学习了一下android拍照的简单实现. 当然该程序是个小例子,非常简单,没有什么复杂的操作,但是可以学习到Android 拍照API流程. 1.在布局文件中添加一个 surfaceView ...

  3. TextView总结

    先看看TextView的类继承结构: java.lang.Object ↳ android.view.View ↳ android.widget.TextView 是直接继承View类的,可扩展性很强 ...

  4. win10无法使用内置管理员账户打开

    对于这种问题其实对于专业版用户倒不是难事,很容易解决,具体方法如下: 首先WIN+R输入:gpedit.msc,打开组策略,找到“计算机配置”里面的“Windows设置”,打开“安全设置” -> ...

  5. handsontable的单元格操作方法

    1.为handsontable添加钩子方法 addHook(key,callback):key为钩子方法名 <span style="font-size:18px;"> ...

  6. AngularJs登录

    AngularJs 登录的简单实现 多数AngularJs应用离不开登录操作,最近阅读了一篇关于AngularJs登录的博客,博客中实现的登录系统demo能够应用于多数小型AngularJs应用,实现 ...

  7. unity3d 建树篇

    今天碰到有人问这个问题,然后我经过一番折腾,找到了方法.例如以下: 有学过Unity3d的同学生都知道我们在对地形拖拉树木等表层时,其树木在我们实例执行中,它们都是能够任其他物体穿过. 这是为什么.相 ...

  8. jquery模仿css3延迟效果

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  9. VB短信猫开发包,支持超长短信

    一.短信猫开发包(长短信/异步调用)说明:   短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...

  10. PHP函数参数的引用传递和值传递

    函数的参数传递有两种方式 1,值传递 常见的 test($param)  方式就是值传递,在函数内部修改$param,不会影响外部变量$param的值 2,引用传递 参数是引用传递的方式,此时函数内部 ...