为什么是typeof(T)!= instance.getType()?

菲利普

我正在一家工厂内工作,该工厂将根据类型返回接口的通用实现。

我的主要问题是
在此处输入图片说明为什么这些typeof(TException)!= exception.GetType()?分别,我必须更改什么才能为TException具有正确的类型?

上面的代码导致InvalidCast异常,因为它尝试强制转换为IDocumedisExceptionHandler<DocumedisException>而不是IDocumedisExceptionHandler<FhirParsingException>

工厂实施:

internal class DocumedisExceptionHandlerFactory : IDocumedisExceptionHandlerFactory
{
    private readonly IDictionary<Type, object> _exceptionHandlers = new ConcurrentDictionary<Type, object>();

    public void RegisterExceptionHandler<TException>(IDocumedisExceptionHandler<TException> exceptionHandler)
        where TException : DocumedisException
    {
        _exceptionHandlers.Add(typeof(TException), exceptionHandler);
    }

    public IDocumedisExceptionHandler<TException> GetDocumedisExceptionHandler<TException>(TException exception)
        where TException : DocumedisException
    {
        _exceptionHandlers.TryGetValue(exception.GetType(), out var exceptionHandler);
        return (IDocumedisExceptionHandler<TException>) exceptionHandler;
    }
}

附带问题:是否有比object字典值更好的方法

在启动程序中注册处理程序:

var exceptionHandlerFactory = app.ApplicationServices.GetService<IDocumedisExceptionHandlerFactory>();
exceptionHandlerFactory.RegisterExceptionHandler(new FhirParsingExceptionHandler());

在哪里FhirParsingExceptionHandler实施IDocumedisExceptionHandler

internal class FhirParsingExceptionHandler : IDocumedisExceptionHandler<FhirParsingException>
{
    public void HandleException(FhirParsingException exception, out HttpStatusCode httpStatusCode, out OperationOutcome.IssueType issueType, out string message)
    {
        httpStatusCode = HttpStatusCode.BadRequest;
        issueType = OperationOutcome.IssueType.Invalid;
        message = exception.Message;
    }
}

处理程序定义(在哪里TException相反):

public interface IDocumedisExceptionHandler<in TException>
    where TException : DocumedisException
{
    void HandleException(TException exception, out HttpStatusCode httpStatusCode, out OperationOutcome.IssueType issueType, out string message);
}

FhirParsingException扩展DocumedisException

public class FhirParsingException : DocumedisException
{
   [...]
}

从中间件检索处理程序:

public async Task Invoke(HttpContext context)
{
   try
   {
      await _next.Invoke(context);
   }
   catch (Exception ex)
   {
      if (ex is DocumedisException documedisException)
      {
         await HandleDocumedisExceptionAsync(context, documedisException);
      }
      else
      {
         throw;
      }
   }
}

private async Task HandleDocumedisExceptionAsync<TException>(HttpContext context, TException ex, MedicationAnalyzerErrorCode? errorCode = null)
   where TException : DocumedisException
{
   var exceptionHandler = _documedisExceptionHandlerFactory.GetDocumedisExceptionHandler(ex);
   [...]
}
中间

typeof(TException)为您提供的编译时间类型exceptionexception.GetType()为您提供的运行时类型exception这两个不需要完全相同,编译器所做的唯一保证就是运行时类型exception可以分配给TException变量。

考虑以下:

class Animal { }
class Turtle: Animal { }
bool CheckTypes<T>(T animal) where T: Animal 
{
     return typeof(T) == animal.GetType();
}

现在您有了:

Animal animal = new Turtle();
Feed(animal);

放心,CheckTypes会退货false泛型类型参数的类型为,Animal但是的运行时类型animalTurtle

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

typeof(T)与o.GetType()

来自分类Dev

typeof(T)vs.Object.GetType()性能

来自分类Dev

GetType()== typeOf(string)或var是string ...?

来自分类Dev

GetType()和typeof()是否构成反射?

来自分类Dev

为什么FirstNode.GetType()返回XElement而不是XNode

来自分类Dev

为什么 GetType() 无法识别这种类型?

来自分类Dev

getType在antlr4中做什么?

来自分类Dev

c#如何从GetType()转换为T

来自分类Dev

c#如何从GetType()转换为T

来自分类Dev

使用哪个好:Object.GetType()== typeof(Type)或Object is Type?

来自分类Dev

在通用类实例中,typeof(T)和this.GetType()。GetGenericArguments()[0]是否始终等效?

来自分类Dev

java中的getType()和getClass()有什么区别?

来自分类Dev

TypedArray.getType(int index)中的整数对应什么?

来自分类Dev

t.GetType()是否返回相同的Type实例?

来自分类Dev

如何在ObservableCollection <T>中使用GetType返回的类型?

来自分类Dev

无法使用Type.GetType(string)获取LinkedList`T的类型

来自分类Dev

如何使用ObservableCollection <T>中GetType返回的类型?

来自分类Dev

接口实例为什么具有GetType,GetHashCode,Equals和ToString方法?

来自分类Dev

为什么在GWT标头中无法识别“ mouseover” .equals(event.getType())?

来自分类Dev

为什么php gettype函数总是从$ _POST [$ var]返回字符串?

来自分类Dev

为什么parameter.getType()。isInstance(HttpServletRequest.class)返回为false,但使用“ ==”为true

来自分类Dev

为什么Assembly.GetType()对通用类型实例不起作用?

来自分类Dev

为什么type.Assembly.GetType(type.Name)返回null?

来自分类Dev

Powershell的GetType

来自分类Dev

为什么这些不一样?为什么在 C# 中`type.GetType() is Test` 不是真的?

来自分类Dev

typeof()有效,获取属性时GetType()不起作用

来自分类Dev

typeof(Foo)有效,但Type.GetType(“ Foo”)为null

来自分类Dev

为什么我要在一个空数组上调用GetType()但不能从函数返回它时调用

来自分类Dev

使用对象类型存储int值时,为什么object.GetType()返回system.Int32?

Related 相关文章

  1. 1

    typeof(T)与o.GetType()

  2. 2

    typeof(T)vs.Object.GetType()性能

  3. 3

    GetType()== typeOf(string)或var是string ...?

  4. 4

    GetType()和typeof()是否构成反射?

  5. 5

    为什么FirstNode.GetType()返回XElement而不是XNode

  6. 6

    为什么 GetType() 无法识别这种类型?

  7. 7

    getType在antlr4中做什么?

  8. 8

    c#如何从GetType()转换为T

  9. 9

    c#如何从GetType()转换为T

  10. 10

    使用哪个好:Object.GetType()== typeof(Type)或Object is Type?

  11. 11

    在通用类实例中,typeof(T)和this.GetType()。GetGenericArguments()[0]是否始终等效?

  12. 12

    java中的getType()和getClass()有什么区别?

  13. 13

    TypedArray.getType(int index)中的整数对应什么?

  14. 14

    t.GetType()是否返回相同的Type实例?

  15. 15

    如何在ObservableCollection <T>中使用GetType返回的类型?

  16. 16

    无法使用Type.GetType(string)获取LinkedList`T的类型

  17. 17

    如何使用ObservableCollection <T>中GetType返回的类型?

  18. 18

    接口实例为什么具有GetType,GetHashCode,Equals和ToString方法?

  19. 19

    为什么在GWT标头中无法识别“ mouseover” .equals(event.getType())?

  20. 20

    为什么php gettype函数总是从$ _POST [$ var]返回字符串?

  21. 21

    为什么parameter.getType()。isInstance(HttpServletRequest.class)返回为false,但使用“ ==”为true

  22. 22

    为什么Assembly.GetType()对通用类型实例不起作用?

  23. 23

    为什么type.Assembly.GetType(type.Name)返回null?

  24. 24

    Powershell的GetType

  25. 25

    为什么这些不一样?为什么在 C# 中`type.GetType() is Test` 不是真的?

  26. 26

    typeof()有效,获取属性时GetType()不起作用

  27. 27

    typeof(Foo)有效,但Type.GetType(“ Foo”)为null

  28. 28

    为什么我要在一个空数组上调用GetType()但不能从函数返回它时调用

  29. 29

    使用对象类型存储int值时,为什么object.GetType()返回system.Int32?

热门标签

归档