gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:17:58 25 4
gpt4 key购买 nike

我有一个返回 byte[] 的方法,但现在我想避免在该方法上使用泛型来提供返回类型。我目前将一个参数传递给此方法,该方法包含将序列化为 byte[] 返回结果的数据的类型 的详细信息。

问题:

How do I perform a dynamic cast of the result of .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 调用的返回 value 的类型相匹配。

为了选择调用这些方法中的哪一个,您需要再次使用反射来获取匹配正确类型的MethodInfo,然后调用您的Serialize 方法。如果它不是扩展方法,它可能会有所帮助,因为现在您无法像编译器仅在编译时那样查找扩展方法。扩展方法匹配非常费力,不适合动态调用。

相反,如果您想再次使用反射来调用 Serialize,而不需要一个巨大的 switch 语句,那么您需要一个包含所有 Serialize 的实用程序类> 方法作为该类中的公共(public)重载。至少这是解决问题的一种方法。

关于c# - 如何在 C# 中使用表示反射结果类型的变量进行转换 .Invoke(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6053093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com