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

时间:2013-09-10 00:32:45

标签: c# generics methods overloading

考虑以下方法:

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”);有没有办法实现我想做的事情?

1 个答案:

答案 0 :(得分:3)

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

 foo((dynamic)a.Value);
}

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