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

Typecastinc#usingstringnameofobjecttypeshare

时间:2023-04-11 10:33:22 C#

typecastinc#usingstringnameofobjecttype我有下面的代码,应该很容易通过publicclassFoo{publicvoidFooHasAMethod(){Console.WriteLine("是我,foo!!!");}}publicclassBar{publicFooFooProperty{get;放;}}publicclassFooBar{publicstaticvoidMain(){Barbar=newBar{FooProperty=newFoo()};CallPropertyByName(bar,"Foo");}publicstaticvoidCallPropertyByName(Barbar,stringpropertyName){PropertyInfopi=bar.获取类型()。GetProperty(属性名+"属性");objectfooObj=pi.GetValue(bar,null);((Foo)fooObj).FooHasAMethod();//这行得通/*但我想使用*((Type.GetType(propertyName))fooObj).FooHasAMethod();此行需要修复*它不起作用*有没有一种方法可以使用对象的字符串名称来进行类型转换?**/}}输入fooObjType=fooObj.GetType();MethodInfo方法=fooObjType.GetMethod("FooHasAMethod");method.Invoke(fooObj,newobject[0]);如果您使用.NET4=Ddynamicobj=bar;这实际上很容易对象.FooProperty.FooHasAMethod();但是,如果您只想将结果转换为不同的类型,则可以在运行时使用Convert.ChangeType方法来完成:objectsomeBoxedType=newFoo();BarmyDesiredType=Convert.ChangeType(typeof(Bar),someBoxedType)asBar;现在,这与实际类型Foo和Bar有很强的联系但是,您可以概括该方法以获得您想要的:publicTGetObjectAs(objectsource,TdestinationType)whereT:class{returnConvert.ChangeType(typeof(T),来源)作为T;你可以这样调用:Barx=GetObjectAs(someBoxedType,newBar());SomeTypeYouWantx=GetObjectAs(someBoxedType,Activator.CreateInstance(typeof("SomeTypeYouWant")));使用激活器,您可以在运行时创建任何您想要的类型。并通过推断它试图从boxedType转换为运行时类型来欺骗泛型方法。此外,如果您只想调用某个动态属性值的方法,最佳做法(imo)是简单地使其成为某个所需的对象。ISomethingpropValue=obj.GetProperty("FooPropery").GetValue(obj,null)asISomething;if(propValue!=null)propValue.FooHasAMethod();无法在编译时转换为未知类型。查看.NET4.0动态类型。字符串无法进行转换。但是可以用dynamic或者MethodInfo来调用上面是C#学习教程:用对象类型的字符串名来打c#中cast的全部内容,如果对大家有用还需要进一步了解C#学习教程,希望大家注意~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: