[英]Cast object to Task<T> and set T from variable with type Type
[英]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.