栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

有没有比“打开类型”更好的选择了?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

有没有比“打开类型”更好的选择了?

C#中绝对没有打开类型的开关( 更新:在C#7 / VS 2017中支持打开类型- 请参见下面的Zachary
Yates的回答
)。为了在没有较大的if / else if
/ else语句的情况下执行此操作,您需要使用其他结构。我不久前写了一篇博客文章,详细介绍了如何构建TypeSwitch结构。

https://docs.microsoft.com/archive/blogs/jaredpar/switching-on-
types

简短版本:TypeSwitch旨在防止冗余转换,并提供类似于普通switch /
case语句的语法。例如,这是在标准Windows窗体事件中起作用的TypeSwitch

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

TypeSwitch的代码实际上很小,可以轻松地放入您的项目中。

static class TypeSwitch {    public class CaseInfo {        public bool IsDefault { get; set; }        public Type Target { get; set; }        public Action<object> Action { get; set; }    }    public static void Do(object source, params CaseInfo[] cases) {        var type = source.GetType();        foreach (var entry in cases) { if (entry.IsDefault || entry.Target.IsAssignableFrom(type)) {     entry.Action(source);     break; }        }    }    public static CaseInfo Case<T>(Action action) {        return new CaseInfo() { Action = x => action(), Target = typeof(T)        };    }    public static CaseInfo Case<T>(Action<T> action) {        return new CaseInfo() { Action = (x) => action((T)x), Target = typeof(T)        };    }    public static CaseInfo Default(Action action) {        return new CaseInfo() { Action = x => action(), IsDefault = true        };    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/596982.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号