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

从匿名类型中获取值?分享

时间:2023-04-10 20:56:07 C#

从匿名类型中获取价值?假设我们有以下方法:publicobjectTest(){returnnew{A="Test"};是否可以获取存储在A中的值?varb=测试();//有机会把它转换成匿名类型吗?请注意,从方法返回匿名类型或Tuple是一件坏事,但您问了一个关于如何做而不是“这是一个好主意”的问题......通过使用动态或反射......dynamicb=Test();字符串str=bA;或者作弊:publicstaticobjectTest(){returnnew{A="Test"};}publicstaticstringGetA(objectobj){//我们创建一个与Test()中相同类型的匿名类型//只是为了拥有它的类型。varx=new{A=字符串。空的};//我们将它传递给Cast,它将从x的类型中获取它的T//并将返回转换为匿名类型的obj//typex=Cast(x,obj);//现在在x中我们有obj,但是是强类型的。所以xA是我们想要的值//returnxA;}publicstaticTCast(Ttype,objectobj)whereT:class{return(T)obj;}stringstr=GetA(测试());在C#中,所有具有相同类型的相同属性的匿名类型将被合并在一起。所以Test()和GetA()的new{A}属于同一类型。Cast是从匿名类型中提取类型的有用技巧。您将您键入的匿名类型作为第一个参数(仅用于“激活”genericsT)传递,并将您要转换的对象作为第二个参数传递。类似的技巧可用于创建通用类型的集合,例如publicstaticTMakeList(Ttype){returnnewList();}//有机会把它转换成匿名类型吗?是的,您可以通过示例使用强制转换。publicstaticTCastByExample(thisobjectobj,Texample){return(T)obj;请注意,这仅在您位于同一程序集中时才有效。如果匿名类型属于同一程序集,则它们具有相同的类型,并且属性具有相同类型的相同名称且顺序相同。然后:objectb=Test();varexample=new{A="example"};varcasted=b.CastByExample(例子);Console.WriteLine(casted.A);或者,您可以使用动态:dynamicb=Test();控制台.WriteLine(bA);或者,使用反射:objectb=Test();varproperty=b.GetType().GetProperty("A");varvalue=property.GetValue(b);控制台.WriteLine(值);或者,您可以做正确的事情并创建一个名义上的(即非匿名的)类型。有机会把它转换成匿名类型吗?虽然您可以这样做,但它非常不可靠。因为任何时候你会改变你的匿名类型的创建,你的代码会突然无影无踪地在别处爆发。您可以在他的博客中阅读JonSkeet玩匿名流派的所有失败。同样值得一读的是MarcGravel的评论。上面博客中讨论的重大更改示例。使用系统;staticclassGrottyHacks{internalstaticTCast(objecttarget,Texample){return(T)target;}}classCheesecakeFactory{staticobjectCreateCheesecake(){returnnew{Fruit="Strawberry",Topping="Chocolate"};}staticvoidMain(){objectweaklyTyped=CreateCheesecake();varstronglyTyped=GrottyHacks.Cast(weaklyTyped,new{Fruit="",Topping=""});Console.WriteLine("芝士蛋糕:{0}({1})",stronglyTyped.Fruit,stronglyTyped.Topping);}}都好。现在,如果您突然意识到需要将CreateCheeseCake更改为类似于此静态对象CreateCheesecake(){returnnew{Fruit="Strawberry",Topping="Chocolate",Base="Biscuit"};然后你的这一行发生了什么是varstronglyTyped=GrottyHacks.Cast(weaklyTyped,new{Fruit="",Topping=""});它不会再工作了。以上就是C#学习教程:Getvaluefromanonymoustype?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: