强制转换对象 Task<ActionResult<T>>其中 T 是 Type 变量



我正在用配置文件创建一个单元测试类。我有类似的对象(相同的接口)要检查。

点我的代码我Task对象通过使用反射。我的问题是阅读结果,我必须先转换这个对象,但我不能使用TaskTask>。编译器只允许我转换为所使用的特定类。(如果我没有InvalidCastException)。

我该怎么做?

我的测试代码摘录:

dynamic objectType = Type.GetType($"{ClassName},{Assembly}")!;
Type ControllerActionType = Type.GetType($"{ControllerActionsClasseName}, {Assembly}")!;
MethodInfo info = ControllerActionType.GetMethod(methodName!)!;
var myInstance = Activator.CreateInstance(ControllerActionType, new object[] { context });
var testObject = JsonConvert.DeserializeObject(operation!.Data, objectType);
var actionResult = info!.Invoke(myInstance, new object[] { testObject })!;
var castedActionResult = "** I'm blocked here**";

没有更多的信息,我的猜测是控制器。方法返回一个任务,并且您正在尝试将方法的结果转换为Task

这里只需要进行两个类型转换,一个匹配方法的返回类型,另一个针对Task的结果,是预期的底层类型。

var actionResultTask = (Task<IActionResult>)info!.Invoke(myInstance, new object[] { testObject })!;
var castedActionResult = (ActionResult<InferfaceOfTheObject>) = actionResultTask.Value;
这里的要点是,在没有更多反射的情况下,泛型参数必须匹配。因此,如果ActionResult from方法是用接口声明的,那么它必须被强制转换为ActionResult<InterfaceOfTheObject>,如果它是使用实现声明的,那么必须使用该强制转换。

如果您不确定属性的类型,但确信它的返回类型实现了相关的接口,那么您可以使用以下方法通过反射获得属性值。您应该能够使用它来获取任何属性值。

public void SomeTestMethod() {
/* ... */
var methodResult = (Task)info.Invoke(myInstance, new object[] {});
var actionResult = GetGenericPropertyValue<IActionResult>(methodResult, "Result");
var actionResultValue = GetGenericPropertyValue<InferfaceOfTheObject>(actionResult, "Value");
}

public static T GetGenericPropertyValue<T>(object obj, string propertyName)
{
return (T)obj.GetType().GetProperty(propertyName).GetValue(obj);
}

相关内容

  • 没有找到相关文章

最新更新