繁体   English   中英

如何在C#中使用表示反射结果类型的变量进行转换.Invoke()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM