繁体   English   中英

投射对象任务<ActionResult<T> &gt; 其中 T 是类型变量

[英]cast object Task<ActionResult<T>> where T is Type variable

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

在我的代码中,我通过使用反射获得了Task<ActionResult<OneOfMyObjectType>>对象。 我的问题是阅读结果我必须先转换这个对象,但我不能使用Task<IActionResult>Task<ActionResult<InferfaceOfTheObject>> 编译器只允许我转换为使用的特定类。 (如果我没有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**";

如果没有更多信息,我的猜测是Controller.Method返回一个Task ,并且您正在尝试将该方法的结果转换为Task<ActionResult>

您需要做的只是两种转换,一种与方法的返回类型匹配,另一种与预期的基础类型的任务结果相匹配。

var actionResultTask = (Task<IActionResult>)info!.Invoke(myInstance, new object[] { testObject })!;
var castedActionResult = (ActionResult<InferfaceOfTheObject>) = actionResultTask.Value;

这里的要点是,没有更多的反射,泛型参数必须匹配。 因此,如果方法中的 ActionResult 是使用接口声明的,则必须将其转换为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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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