[英]How in C# to cast using a variable representing a type for the result of reflection .Invoke()
我有一个返回byte []的方法但是现在想避免在方法上使用泛型来提供返回类型。 我当前将一个参数传递给此方法,该方法具有将序列化为byte []返回结果的数据类型的详细信息。
题:
如何对.Invoke()的结果进行动态转换 ?
我正在使用反射来调用类的方法,这个方法的输出是对象,这个结果需要被强制转换。
编码:
public byte[] SomeMethod(/* some params */)
{
MethodInfo info = /* ... */ .GetMethod(methodToCall);
//Here I want to perform a dynamic cast:
return (info.Invoke(classToCall, methodParams)).Serialize();
//if I was to just have the method fixed to a type it would look like:
return (info.Invoke(classToCall, methodParams) as SomeType).Serialize();
//NOTE: .Serialize() is just my own extension method
}
我没有成功的尝试:
//with returnType as a string
var dynamicType = Type.GetType(returnType);
(info.Invoke(classToCall, methodParams) as dynamicType).Serialize();
还有一些其他的变体有typeof() , GetTypeHandle , .ReflectedType
我错过了一些简单和/或明显的东西,或者我只是想做一些奇怪/愚蠢的事情?
附加说明: SomeMethod是类的方法的重写,因此不希望该方法支持泛型类型。
在这种情况下,演员经常做任何事情是一种常见的误解。 您要么将 Invoke
返回的类型转换为另一种类型,要么即使Invoke
被声明为返回object
,它也已经是您希望它的类型。
由于我认为你不想转换任何东西,你必须首先认识到调用Invoke
的返回值如下:
var result = info.Invoke(classToCall, methodParams);
result
将是object
类型的变量,但该变量中的值已经是您要将其强制转换为的类型 。 你只是不确切地知道它是什么。 你需要知道调用Serialize
是什么。
现在,你有这样的扩展方法,或一组指定的初始编译时的运作超载扩展方法this
参数。 其中一个匹配Invoke
调用的返回值的类型。
为了选择调用这些方法中的哪一个,您需要再次使用反射来获得与正确类型匹配的MethodInfo
,并只调用您的Serialize
方法。 如果它不是扩展方法可能会有所帮助,因为现在您没有简单的方法来查找扩展方法,就像编译器在编译时一样。 扩展方法匹配非常费力,不适合动态调用。
相反,如果你想第二次使用反射来调用Serialize
,而没有巨大的switch语句,那么你需要有一个实用程序类,其中所有的Serialize
方法都是该类中的公共重载。 至少这是解决问题的一种方法。
如果您不想使用泛型,我会想到两种方法。
第一种方法是基于methodToCall进行强制转换。 不太优雅。
if (methodToCall == "method1")
return ((obj1)info.Invoke(classToCall, methodParams)).Serialize();
else if (methodToCall == "method2")
return ((obj2)info.Invoke(classToCall, methodParams)).Serialize();
第二种方法是创建一个由methodToCall的所有可能返回类型继承的超类。 超类将具有由子类声明和继承的.Serialize()。
interface mySuperClass
{
byte[] Serialize();
}
演员为mySuperClass
return (info.Invoke(classToCall, methodParams) as mySuperclass).Serialize();
如果您有大量可能的返回类型,这可能无法正常工作。 快乐的编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.