如何将对象转换为方法 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>
引入一个非通用接口。然后您可以将结果值转换为该接口并设置属性。
我想将 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>
引入一个非通用接口。然后您可以将结果值转换为该接口并设置属性。