簡體   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