相关疑难解决方法(0)

拦截异步方法,通过DynamicProxy返回通用Task <>

我的问题与这篇文章有关拦截使用DynamicProxy调用异步方法

我想实现拦截器,它使用返回TaskTask<T>结果的异步方法.

我使用下一个代码返回ContinueWith结果(以便在拦截器完成工作时调用方法等待)

var task = invocation.ReturnValue as Task;
invocation.ReturnValue = task.ContinueWith(c => 
      { code that should execute after method finish });
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常的Task结果,但在的情况下,Task<T>结果ContinueWith将改变返回类型Task<T>Task.我需要调用返回的重载方法ContinueWith Task<T>,但为此我需要转换invocation.ReturnValueTask<T>

我没有找到以任何方式动态投射它的方法.有谁知道如何制作它?

我也尝试通过反射调用此方法,但参数是labmda函数,不能直接传递.

c# generics castle-dynamicproxy async-await

26
推荐指数
3
解决办法
6025
查看次数

创建与任务一起使用的异常转换动态代理

问题

我不知何故在兜圈子......我尝试使用 Castle Dynamic Proxy 创建一个带有目标的接口代理。代理应该

  • 如果没有抛出异常(即不执行任何操作),则返回调用的返回值。
  • InterceptedException如果调用抛出一个 则抛出 new InvalidOperationException
  • e如果调用抛出另一个异常,则抛出e

换句话说,拦截器应该捕获并转换特定的异常类型,而不是在所有其他情况下拦截。

我让这个适用于同步方法。但是,我需要返回任务的异步方法具有相同的行为。

我尝试过的

我尝试向返回的任务添加延续并检查IsFaultedException类似于此答案。这适用于 return 的方法Task,但不适用于返回的方法,Task<T>因为我的延续是类型Task(并且我不知道T拦截器中有什么) 。

涵盖上述异步方法的三种情况的测试 (XUnit.net)

public class ConvertNotFoundInterceptorTest
{
    [Fact]
    public void Non_throwing_func_returns_a_result()
    {
        Assert.Equal(43, RunTest(i => i + 1));
    }

    [Fact]
    public void InvalidOperationExceptions_are_converted_to_IndexOutOfRangeExceptions()
    {
        var exception = Assert.Throws<AggregateException>(() => RunTest(i => { throw new InvalidOperationException("ugh"); }));
        Assert.True(exception.InnerException is IndexOutOfRangeException);
    }

    [Fact] …
Run Code Online (Sandbox Code Playgroud)

c# castle-dynamicproxy task

1
推荐指数
1
解决办法
1055
查看次数

标签 统计

c# ×2

castle-dynamicproxy ×2

async-await ×1

generics ×1

task ×1