当前位置: 首页 > 编程语言 > C#

C#在运行时切换对象类型分享

时间:2023-04-10 21:24:07 C#

C#在运行时切换对象类型我有一个List。我想遍历列表并以比o.ToString()更友好的方式打印出值,以防某些对象是布尔值或日期时间等。您将如何构造一个我可以调用MyToString(o)和返回格式正确的字符串(由我指定)作为其实际类型?您可以在.NET4.0中使用dynamic关键字,因为您正在处理内置类型。否则,您将使用多态性。示例:使用系统;使用System.Collections.Generic;classTest{staticvoidMain(){Liststuff=newList{DateTime.Now,true,666};foreach(objectoinstuff){dynamicd=o;打印(d);}}privatestaticvoidPrint(DateTimed){Console.WriteLine("I'madate");//替换为您的实际实现}privatestaticvoidPrint(boolb){Console.WriteLine("I'mabool");}privatestaticvoidPrint(inti){Console.WriteLine("I'manint");}}打印出来:I'madateI'maboolI'manint的重要性取决于设计:您是否考虑过以更友好的方式覆盖ToString()?这是一个带注释的工作示例。它使用通用类型的字典和LambdaFunc。使用系统;使用System.Collections.Generic;使用System.Linq;namespaceConsoleApplication1{classProgram{//自定义类publicclassMyPerson{publicstringFN{get;放;}公共字符串LN{得到;放;}}staticvoidMain(string[]args){//你预建的Types字典到Lambda表达式以获取字符串Dictionary>MyToStringLookup=newDictionary>(){{typeof(String),newFunc(obj=>obj.ToString())},{typeof(DateTime),newFunc(obj=>((DateTime)obj).ToString("d"))},{typeof(MyPerson),newFunc(obj=>(objasMyPerson).LN)},};//你的对象列表ListMyObjects=newList(){"abc123",DateTime.Now,newMyPerson(){FN="Bob",LN="Smith"}};//如何遍历对象列表并运行自定义ToStringforeach(MyObjects中的varobj)if(MyToStringLookup.ContainsKey(obj.GetType()))System.Console.WriteLine(MyToStringLookup[obj.GetType()](obj));else//如果对象不存在于你的字典中则默认ionarySystem.Console.WriteLine(obj.ToString());}}}这样的事情可能会让你上路:privatestaticStringMyToString(objecto){varval="";switch(o.GetType().Name){case"Boolean":val=((bool)o)?“这是真的”:“这是假的”;休息;case"DateTime":val="日期是:"+((DateTime)o);休息;case"Int32":val="数值为:"+(int)o;休息;}返回值;}希望这可以帮助!;)你唯一的选择是if-else-if结构开关不允许开放类型,因为开关结构需要一个具有互斥值的可枚举集合(并且一个对象可以是多种类型)。编辑阿巴斯评论:GetType()。该名称是有效的,但会导致您在此上下文中出现潜在错误,因为它可能返回您不知道的类型。即使对象存储为A类型,GetType()。如果BinheritanceA.Name也可能返回“B”。如果您在执行切换的方法的上下文中不知道B(它可能是从当前库之一继承的另一个库的类型,它可能是您编写该方法后添加的类型),您会在伪类型开关中错过它。如果你写if(objisA),你就不会。例如,如果我这样写://////如果obj是Foo,则显示“:)”///publicstaticvoidCaseType(objectobj){switch(obj.GetType().Name){case"Foo":MessageBox.Show(":)");休息;默认值:MessageBox.Show(":(");break;}}注释是谎言,因为publicclassBar:Foo{}publicstaticvoidCaseTypeSpecialized(){Fooobj=newBar();CaseType(obj);}将显示“:(”。如果您编写//////将显示“:)”,如果obj是Foo///publicstaticvoidCaseType(objectobj){if(objis"Foo"){MessageBox.Show(":)");}else{MessageBox.Show(":(");}}这个是switch的概念,非互斥值Incompatible。这就是为什么在取值不互斥的情况下开启Flags枚举可能会出现编译错误的原因.以上就是C#学习教程:C#运行时切换对象类型分享的全部内容,如果对大家有用并且需要详细了解C#学习教程,希望大家多多关注-本文收藏来自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载,请注明出处: