C# 在运行时从泛型类型查找方法重载

本文关键字:查找 方法 重载 泛型类型 运行时 | 更新日期: 2023-09-27 18:30:53

请考虑以下方法:

public void foo(int a) {
   //do something with a
}
public void foo(ushort a) {
   //do something with a
}
public void foo<T>(Nullable<T> a) where T : struct {
     if (!a.HasValue) {
        return;
     }
     foo(a.Value); //find appropriate method based on type of a?
}

有没有办法根据参数的泛型类型找到要调用的相应方法? 例如,如果 (T)a 是一个 int,则调用第一个方法,如果它是一个 ushort,则调用第二个方法。 如果没有超过此类方法,则可能会引发运行时异常。

我尝试了以下方法:

public void foo<T>(Nullable<T> a) where T : struct {
     if (!a.HasValue) {
        return;
     }
     switch(a.Value.GetType()) {
           case typeof(int): foo((int)a.Value); break;
           case typeof(ushort): foo((ushort)a.Value); break;
           //and so on
     }
}

但是编译器不喜欢强制转换("无法将 T 类型转换为 int"); 有什么方法可以实现我想要做的事情吗?

C# 在运行时从泛型类型查找方法重载

试试

public void foo<T>(Nullable<T> a) where T : struct {
 if (!a.HasValue) {
    return;
 }
 foo((dynamic)a.Value);
}

a.Value的类型将在运行时使用 dynamic 解析,并调用相应的重载。