2009-05-15 3 views
1

Можно ли писать в методе C# таким образом, что, когда я пишуC# - поведение метод, который зависит от ожидаемого типа

String contestId = getParameter("contestId") 

я получаю contestId в строке, но когда я пишу:

int contestId = getParameter("contestId") 

Я получаю contestId разобран целым?

Это всего лишь простой пример того, что я пытаюсь достичь.

ответ

15

Невозможно перегрузить методы исключительно на основе их возвращаемого типа. Можно, однако, ввести общий параметр:

T getParameter<T>(string input) { 
    // ... do stuff based on T ... 
} 

И если вы используете C# 3.0 вы можете использовать этот метод:

var str = getParameter<string>("contestid"); 
var integer = getParameter<int>("contestid"); 

таким образом, говоря, фактический тип только один раз.

+0

Я неправильно истолковал это изначально, так что может быть какое-то разъяснение относительно того, что может быть полезным для общего параметра? – workmad3

+0

workmad: Я добавил фрагмент кода. Считаете ли вы, что это требует дополнительных разъяснений? Я попробую, если вы считаете, что это все еще нужно. –

+0

+1 за то, что он первый и правильный. = P – Tony

0
public T GetParameter<T>(string parameterName) 
{ 
    //Do work 
    return value 
} 

string contestId = getParameter<string>("contestId") 
int contestId = getParameter<int>("contestId") 

Это пример вашей лучшей ставки.

3

Одна вещь, которую вы может do - это возврат отдельного объекта, который имеет неявные операторы преобразования как для int, так и для строки. Это приблизилось бы к поведению, о котором вы просите.

Я бы этого не сделал на практике. Неявные преобразования обычно вызывают больше проблем, чем они того стоят.

Вместо этого добавьте общий параметр, как Mehrdad показал:

var str = getParameter<string>("contestid"); 
var integer = getParameter<int>("contestid"); 
+0

+1 за упоминание о возможности. Хотя я бы никогда не писал что-то подобное. –

1

Я предпочитаю этот подход, он читает хорошо.

Public Class ResultProxy 
{ 
    Private Object _Obj 
    Public ResultProxy(Object O) 
    { _Obj = O; } 

    Public T As<T>() 
    { return (T)_Obj; } 
} 

...

Public ResultProxy getParameter("contestId") 
{ 
// your method's code 
    return new ResultProxy(YourPersonalFavorateReturnType); 
} 

...

String s = getParameter("contestId").As<String>(); 
1

Во-первых, ответ не так много людей упоминали. Зачем? Нужно ли приписывать результат метода? Например, вы можете иметь

int getValue() 
{ 
    return 4; 
} 

getValue(); 

Ответ: да, он может, так что нет никакого способа компилятор знать, какой метод вы собираетесь вызвать его тип возвращаемого значения.

Личное мнение здесь, но я хотел бы предложить что-то вдоль линий

public string getContestIdAsString(string ConetestId); 

public int getContestIdAsInt(string ContestId); 

Очень очевидно, что каждый из них делает, и вы получите вокруг вашей проблемы. Если есть что-то, чего я не вижу.

+0

+1, активируйте все, что генерирует твиты, не склонны к ошибкам. Еще одна рекомендация - использовать типы CLR вместо C# (например, getContestIdAsInteger), это общая рекомендация, которая берет начало из многоязыковой природы .NET. Int или bool путают VB, поэтому Integer или Boolean лучше. –

+0

Согласен, если вы хотите жестко настроить поведение на основе нескольких разных типов, но есть случаи, которые вы хотите сделать для многих типов (например, метод расширения Enumerable.OfType ). В этом случае генерируется общий метод. –