如何将对象转换为方法 return 类型

How to cast object to method return type

我想将 args.ReturnValue 设置为从 TResponse<T> 方法创建的对象的实例,该方法称为 Create

[Serializable]
public sealed class LogError : OnMethodBoundaryAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        // Logging part..

        MethodInfo methodInfo = (MethodInfo)args.Method;

        // I want to replace line below comment to get TResponse<T> object instead of dynamic if possible
        dynamic returnValue = Activator.CreateInstance(methodInfo.ReturnType);
        args.ReturnValue = returnValue.Create(CodeMessage.InternalError, MessageType.Error, args.Exception);

        args.FlowBehavior = FlowBehavior.Return;
    }
}

方法 ReturnType 将始终是 TResponse<T>,但我不知道如何根据方法 return 类型创建 TResponse<T> 的实例。 TResponse<T> 使用此签名实现方法:

.Create(CodeMessage.InternalError, MessageType.Error, args.Exception);

Create 方法是 returns TResponse<T> 对象设置参数的静态方法。

因为我不知道如何做我想做的事,所以我使用 Activator 创建方法 return 类型的实例并将其存储为 dynamic 类型,但它抛出 RuntimeBinderException 当我调用 Create 方法时。

由于 Create(...) 是静态的,您不需要使用 Activator class 创建实例。只需从 ReturnType 获取 MethodInfo 并使用 null 作为第一个参数调用它:

public override void OnException(MethodExecutionArgs args)
{
    // Logging part..

    MethodInfo methodInfo = (MethodInfo)args.Method;

    MethodInfo create = methodInfo.ReturnType.GetMethod(
                    "Create",
                    new[] { typeof(CodeMessage), typeof(MessageType), typeof(Exception) });
    args.ReturnValue = create.Invoke(null, new object[] { CodeMessage.InternalError, MessageType.Error, args.Exception });

    args.FlowBehavior = FlowBehavior.Return;
}

MethodInfo.Invoke return 一个 object。由于 MethodExecutionArgs.ReturnValue 也只是一个 object,您不需要转换为实际的 TResponse 类型。

无论如何,如果您需要在 return 值上设置一些额外的属性,我会为 TResponse<T> 引入一个非通用接口。然后您可以将结果值转换为该接口并设置属性。