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

如何将对象转换为Type类描述的类型?分享

时间:2023-04-10 15:11:44 C#

一个对象如何转换成Type类描述的类型?我有一个对象:ExampleClassex=newExampleClass();和:类型TargetType我想将ex类型转换为TargetType描述的类型:Objecto=(TargetType)ex;但是当我这样做时,我得到:notfoundtothetypeornamespacename't'那怎么办?我在这里错过了什么吗?更新:我想得到这样的东西:publicCustomClassMyClassOuter{get{return(CustomClass)otherClass;}}私有其他类;因为我会有很多这样的属性,所以我想这样做:publicCustomClassMyClassOuter{get{return(GetThisPropertyType())otherClass;}}私有SomeOtherTypeClass其他类;上下文:通常在我的类的上下文中,我需要创建许多属性。并在每一个中替换cast属性的类型。这对我来说似乎没有意义(在我的上下文中),因为我知道返回类型是什么并且我想编写一些代码来为我进行转换。也许泛型就是这种情况,我还不知道。这就像我可以保证在这个属性中我得到了正确的对象并且是正确的类型并且100%能够将它转换为属性类型。我只需要这样做,这样我就不需要在每个属性中指定它必须“将值转换为CustomClass”,我想做一些类似“将值转换为与该属性相同的类”的事情。例如:classMYBaseClass{protectedListMyInternalObjects;}classMyClass{publicSpecialClassMyVeryOwnSpecialObject{get{return(SpecialClass)MyInteralObjects["MyVeryOwnSpecialObject"];好吧-我可以像上面那样制作许多属性-但有2个问题:1)我需要在MyInternalObjects上指定对象的名称,但它与属性名称相同。我使用System.Reflection.MethodBase.GetCurrentMethod()。这个名字解决了这个问题。2)在每个属性中,我需要将对象从MyInternalObjects转换为不同的类型。例如,在MyVeryOwnSpecialObject中-到SpecialClass。它始终与财产相同。这就是为什么我想做这样的事情:classMYBaseClass{protectedListMyInternalObjects;}classMyClass{publicSpecialClassMyVeryOwnSpecialObject{get{return(GetPropertyType())MyInteralObjects[System.Reflection.MethodBase.GetCurrentMethod().Name];现在担心:好的,为什么?因为在我的应用程序中,我将获得安全类型等的所有好处(智能感知)。第二:但是现在你在这个地方失去了类型安全?不,因为我很确定我的列表中有我的类型的对象。对象o=(TargetType)ex;这段代码没用。您可能在右边有一个类型,但在左边它仍然??只是一个对象。您不能像这样使用特定于TargetType的函数。以下是如何调用给定类型的未知对象的方法:objectmyObject=newUnknownType();输入t=typeof(UnknownType);//myObject.GetType()也可以工作MethodInfosayHelloMethod=t.GetMethod("SayHello");sayHelloMethod.Invoke(myObject,null);使用这个UnknownType类:classUnknownType{publicvoidSayHello(){Console.WriteLine("Helloworld.");通常,这样做的愿望表明存在误解。但是,偶尔会有这样做的正当理由。这取决于它是要进行带拆箱的参考转换还是用户定义的转换。如果是引用转换,则意味着实际值(引用)将保持完全相同。所有参与者都执行检查,然后复制值。这没有实际用途——您可以使用Type.IsAssignableFrom来执行检查,如果您想在对象类型的变量中使用它,只需使用隐式转换对象即可。强制转换的主要目的是为编译器提供更多信息。现在,如果您只知道执行时的类型,那显然对编译器没有帮助。演出结束后你打算怎么处理o?如果你能解释一下,我们可以试着解释一下如何达到你想要的效果。如果您真的想进行用户定义的转换或拆箱转换,那可能是另一回事——但我怀疑情况并非如此。编辑:看到您的更新后,您的属性被声明为返回一个CustomClass,因此您只需要:publicCustomClassMyClassOuter{get{return(CustomClass)otherClass;}}我怀疑你实际上并没有给我们我们需要的所有信息。一定是你的属性定义的方式,CustomClass是显式类型?当您知道属性类型时,为什么要尝试动态执行转换?编辑:听起来你只是想节省一些打字——让剪切和粘贴更容易。不。你在编译时知道类型,因为你在编译时知道属性的类型(它只在上面的代码中指定了几行)。直接使用类型。同样,不要试图通过获取当前方法的名称来确定使用哪个键。直接输入名称即可。同样,您在编译时就知道了,为什么是动态的?我完全赞成在有意义的时候偷懒,但在这种情况下,它就是没有。现在这似乎是不可能的,但很快就会在.NET4.0中通过一个名为“动态”的新功能成为可能:http://www.codeguru.com/vb/vbnet30/article.php/c15645__4/我不完全确定你想做什么,但我得到的印象是你想要一个对象的单个实例,它可以“表现得像”许多不同类型的对象,你想要的有吸气剂,这将使你可以轻松地查看这个对象以各种不同的方式。在这种情况下,我建议像这样创建一个getter方法(不是属性):publicTGet(){return(T)myObject;然后你会这样称呼它:Foofoo=box.Get();barbar=box.Get();//等等...有两个注意事项:这绝对不是类型安全的,因为您可以为T传递任何类型,包括转换失败的类型。您可以对其进行一些限制,例如:publicTGet()whereT:SomeBaseType如果您尝试使用与SomeBaseType不兼容的类型,这将导致编译错误,但我不确定它是否完全可靠。但希望这能让你大部分时间都在这里。这是你的想法吗?if(exisExampleClass){ExampleClassmyObject=(ExampleClass)ex;那样就可以了,但我想问题是你想达到什么目的?为什么?我经常发现,如果某件事真的非常非常难,那么我可能做错了。以上就是C#学习教程:如何将一个对象转换为Type类所描述的类型?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: