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

在C#中转换为反射类型分享

时间:2023-04-10 22:35:24 C#

在C#中转换为反射类型请考虑以下代码://objectMakeFoo(){returnnewFoo();}MethodInfomethodInfo=typeof(Program).GetMethod("Baz");//FooBaz(){returnfoo;}类型typeFoo=methodInfo.ReturnType;var结果=(typeFoo)objFoo;我是否需要对typeFoo施展魔法才能获得结果?否:-)情况1:对象objFoo=MakeFoo();//objectMakeFoo(){returnnewFoo();}Fooresult=(Foo)objFoo;这里没有反射,因为你在编译时就知道Foo类型。案例2:接口。通常最好...您不知道MakeFoo返回什么,但您知道它是一个IFoo接口...objectobjFoo=MakeFoo();//objectMakeFoo(){returnnewFoo();}IFooresult=(IFoo)objFoo;情况3:您不确定MakeFoo是否返回Foo对象objFoo=MakeFoo();//objectMakeFoo(){returnnewFoo();}if(objFooisFoo){Fooresult=(Foo)objFoo;或者,像objectobjFoo=MakeFoo();//objectMakeFoo(){returnnewFoo();}Foofoo=objFooasFoo;if(foo!=null){//使用foo}案例4:类型Foo对你的程序一无所知。你没有可用的Foo类……objectobjFoo=MakeFoo();//对象MakeFoo(){returnnewFoo();}类型typeFoo=objFoo.GetType();//你应该先检查空值!//现在?动态foo=objFoo;//因为你知道foo可以Quack(1,2,3)!字符串结果=foo.Quack(1,2,3);//请注意,如果没有//stringQuack(int,int,int)方法,它将以RuntimeBinderException爆炸!动态内部使用反射。可以直接使用反射获取Quack方法并调用它Case5:和Case4一样,但是使用直接反射:objectobjFoo=MakeFoo();//objectMakeFoo(){returnnewFoo();}类型typeFoo=objFoo.获取类型();//你应该在之前检查空值!MethodInfomi=type.GetMethod("嘎嘎");//你应该检查Quack方法//是否存在stringresult=(string)mi.Invoke(objFoo,newobject[]{1,2,3});或者,通过一些健全性检查,如果您不确定foo能否正确发出嘎嘎声:int),typeof(int)},null);如果(mi!=null&&typeof(string).IsAssignableFrom(mi.ReturnType)){stringresult=(string)mi.Invoke(objFoo,newobject[]{1,2,3});}Case-Infinity:您的程序完全不知道Foo类型。您没有可供参考的Foo类。您没有IFoo接口。你甚至不知道Foo是什么,你只知道它是一个类(或者它可能是一个盒装结构,但从你的角度来看它并没有改变......它不能是一个接口,因为在每个接口后面必须有总是一个具体的类/结构。你不知道它的方法,它的字段,它的属性(因为你不知道Foo是什么)。即使您可以将一个对象投射到这个未知类,您还能做什么?您不能在代码中使用接受它作为参数/返回值的方法,因为如果您有某个地方:intINeedFoo(Foopar){return0;}那么显然你会知道Foo。.NET库不能有接受它作为参数/返回值的方法,因为如果有,你就会知道Foo。您唯一可以做的就是将它传递给您通过反射发现的接受Foo作为参数的其他方法...但是Invoke方法将对象数组作为参数...您不需要将对象转换为调用调用!你只需要把它放在一个数组中。这相当于:objectobjFoo=MakeFoo();Foo结果=(Foo)objFoo;在编译时将对象转换为未知类型是没有意义的——您将无法使用它:objectobjFoo=MakeFoo();UnknownType结果=(UknownType)objFoo;由于您不知道UknownType是什么,因此如果不进行反射或动态处理,您将无法使用它的任何方法。以上就是C#学习教程的全部内容:在C#中转换为反射类型。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: