如何将Func <T,object>转换为Func <Exception,object>

西蒙·B

我想创建一个字典来存储异常和该异常的格式化程序。

Dictionary<Type, Func<Exception, ApiErrorResponse>>

我可以像这样直接将它们添加到字典中

Dictionary<Type, Func<Exception, ApiErrorResponse>> _exceptionFormatters =
            new Dictionary<Type, Func<Exception, ApiErrorResponse>>
            {
                {
                    typeof(ValidationException),
                    ex =>
                    {
                        var e = ex as ValidationException;
                        return new ApiErrorResponse(HttpStatusCode.UnprocessableEntity, e.Errors);
                    }
                },
                {
                    typeof(NotFoundException),
                    ex =>
                    {
                        var e = ex as NotFoundException;
                        return new ApiErrorResponse(HttpStatusCode.NotFound, e.Message);
                    }
                }
            };

但是我想用通用AddExceptionFormatter方法来做

public static void AddExceptionFormatter<T>(Func<T, ApiErrorResponse> Value) where T : Exception
{
    if (_exceptionFormatters.ContainsKey(typeof(T)))
        _exceptionFormatters[typeof(T)] = (Func<Exception, ApiErrorResponse>)Value;
    else
        _exceptionFormatters.Add(typeof(T), (Func<Exception, ApiErrorResponse>)Value);
}

这是我如何调用它。

AddExceptionFormatter<NotFoundException>(ex =>
            {
                return new ApiErrorResponse(
                    HttpStatusCode.NotFoundException,
                    nameof(NotFoundException),
                    ex.Message);
            });

但是不幸的是我 Unable to cast object of type 'System.Func`2[NotFoundException,ApiErrorResponse]' to type 'System.Func`2[System.Exception,ApiErrorResponse]'.

任何想法我该如何投放Func<,>

清扫器

该字典存储“即采取任何功能Exception的”,但你给字典中“功能,采取具体ExceptionT”。显然,“具有特定Exception于的功能T”不是一种“具有任何Exceptions的功能”。

为了弄清楚为什么它可以中断,请假设:

AddExceptionFormatter<NotFoundException>(x => x.Foo);

在哪里Foo具有属性,NotFoundException类型为ApiErrorResponse

现在,如果我做这个顽皮的事情:

_exceptionFormatters[typeof(NotFoundException)](new Exception())

显然,这可以通过类型检查,因为我可以将传递ExceptionFunc<Exception, ApiErrorResponse>,但Exception实际上没有Foo属性!这就是为什么您不允许演员。

这里的根本问题是,您不能向编译器保证“如果typeof(X)是字典的键之一,_exceptionFormatters[typeof(X)]则将是类型Func<X, ApiErrorResponse>”。C#的类型系统不足以支持它。

当某人做上述调皮的行为时,您需要决定要发生什么。假设您想引发异常,则可以使用lambda:

public static void AddExceptionFormatter<T>(Func<T, ApiErrorResponse> Value) where T : Exception
{
    _exceptionFormatters[typeof(T)] = x => Value((T)x);
}

这将导致InvalidCastException引发。您当然可以在lambda中做更多的事情:

x => {
    if (x is T t) {
        return Value(t);
    } else {
        throw new YourCustomException("some custom message");
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将IQueryable <T>转换为Expression <Func <T,bool >>?

来自分类Dev

是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

来自分类Dev

将谓词<T>转换为Func <T,bool>

来自分类Dev

如何将Object数组转换为整数数组

来自分类Dev

如何将List(Of String)转换为Object()?

来自分类Dev

将Expression <Func <T,TProperty >>转换为Expression <Func <object,object >>,反之亦然

来自分类Dev

将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

来自分类Dev

如何将简单的视图模型转换为Func <T,bool>谓词?

来自分类Dev

无法将类型System.Linq.Expression <System.Func <Object,bool >>隐式转换为bool

来自分类Dev

C#成员表达式Func <T,object>转换为Func <T,bool> MethodBinaryExpression

来自分类Dev

将表达式转换为Expression <Func <T,bool >>

来自分类Dev

ConcurrentDictionary-将addValueFactory(Func <string,T,T>)转换为updateValueFactory(Func <string,T,T>)?

来自分类Dev

如何将[object Object]转换为数组?

来自分类Dev

将通用T强制转换为Object []

来自分类Dev

如何将runtime.Object转换为特定类型?

来自分类Dev

如何将Func <实现,任务>转换为Func <接口,任务>

来自分类Dev

在将对象强制转换为system.Func <object>时出错

来自分类Dev

如何将Func <T,object>转换为Func <Exception,object>

来自分类Dev

无法将OrderBy(Func <T,IComperable>)转换为SQL

来自分类Dev

将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

来自分类Dev

将Func <T,TProperty>转换为Expression <Func <T,Property >>

来自分类Dev

如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

来自分类Dev

将通用T强制转换为Object []

来自分类Dev

无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

来自分类Dev

如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

来自分类Dev

如何将 Expression<Func<TSource,string>> 转换为 Expression<Func<object,string>>

来自分类Dev

将 Expression<Func<Tin, object>> 转换为 Expression<Func<Tin, Tout>>

来自分类Dev

如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

来自分类Dev

IronPython 抛出以下异常:无法将 Func<PythonFunction,Object> 类型的对象转换为 Func<CodeContext, CodeContext>

Related 相关文章

  1. 1

    如何将IQueryable <T>转换为Expression <Func <T,bool >>?

  2. 2

    是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

  3. 3

    将谓词<T>转换为Func <T,bool>

  4. 4

    如何将Object数组转换为整数数组

  5. 5

    如何将List(Of String)转换为Object()?

  6. 6

    将Expression <Func <T,TProperty >>转换为Expression <Func <object,object >>,反之亦然

  7. 7

    将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

  8. 8

    如何将简单的视图模型转换为Func <T,bool>谓词?

  9. 9

    无法将类型System.Linq.Expression <System.Func <Object,bool >>隐式转换为bool

  10. 10

    C#成员表达式Func <T,object>转换为Func <T,bool> MethodBinaryExpression

  11. 11

    将表达式转换为Expression <Func <T,bool >>

  12. 12

    ConcurrentDictionary-将addValueFactory(Func <string,T,T>)转换为updateValueFactory(Func <string,T,T>)?

  13. 13

    如何将[object Object]转换为数组?

  14. 14

    将通用T强制转换为Object []

  15. 15

    如何将runtime.Object转换为特定类型?

  16. 16

    如何将Func <实现,任务>转换为Func <接口,任务>

  17. 17

    在将对象强制转换为system.Func <object>时出错

  18. 18

    如何将Func <T,object>转换为Func <Exception,object>

  19. 19

    无法将OrderBy(Func <T,IComperable>)转换为SQL

  20. 20

    将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

  21. 21

    将Func <T,TProperty>转换为Expression <Func <T,Property >>

  22. 22

    如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

  23. 23

    将通用T强制转换为Object []

  24. 24

    无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

  25. 25

    如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

  26. 26

    如何将 Expression<Func<TSource,string>> 转换为 Expression<Func<object,string>>

  27. 27

    将 Expression<Func<Tin, object>> 转换为 Expression<Func<Tin, Tout>>

  28. 28

    如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

  29. 29

    IronPython 抛出以下异常:无法将 Func<PythonFunction,Object> 类型的对象转换为 Func<CodeContext, CodeContext>

热门标签

归档