2013-09-10 2 views
2

Рассмотрят следующие методы:с методом # находкой перегрузка от общего типа во время выполнения

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, вызовите первый метод, если это укорт, вызовите второй. Если такой метод не существует, возможно, выведите исключение во время выполнения.

Я попытался следующие:

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 в целое»); Есть ли способ достичь того, что я пытаюсь сделать?

+0

Сначала вы можете использовать 'object', как в:' (int) (object) a.Value'. –

+0

Кастинг для объекта также работает. Я предпочитаю решение dcastro, так как мне даже не нужно использовать оператор switch и вручную проверять каждый тип. –

ответ

3

попробовать

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

foo((dynamic)a.Value); 
} 

a.Value «s типа будут разрешены во время выполнения программы с помощью dynamic, и соответствующая перегрузка будет вызвана.

+0

работает отлично! Наконец, нашел пример, когда динамика полезна. Большое спасибо :) –

+0

FYI, это приведет к сбою с исключением во время выполнения, если подходящая перегрузка не найдена. –

Смежные вопросы