Как я могу позволить методу принимать либо строку, либо int? - PullRequest
2 голосов
/ 05 февраля 2011

Используя C # 4.0, есть ли способ разрешить методу (без создания перегрузки) принять строку или целое число, а затем разрешить мне определить, какой тип был передан?

Ответы [ 4 ]

17 голосов
/ 05 февраля 2011

Поскольку вы используете C # 4.0, вы можете написать универсальный метод . Например:

void MyMethod<T>(T param)
{
    if (typeof(T) == typeof(int))
    {
        // the object is an int
    }
    else if (typeof(T) == typeof(string))
    {
        // the object is a string
    }
}

Но вы должны очень серьезно подумать, является ли это хорошей идеей. Приведенный выше пример немного пахнет кодом. Фактически, весь смысл дженериков должен быть дженерик . Если вам требуется особый случай, когда ваш код зависит от типа передаваемого объекта, это признак того, что вы должны использовать вместо этого перегрузку. Таким образом, каждая перегрузка метода обрабатывает свой уникальный случай. Я не могу представить себе никакого недостатка для этого.

4 голосов
/ 05 февраля 2011

Конечно, вы можете!Примером этого является

    public void MyMethod(object o)
    {
        if (o.GetType() == typeof(string))
        {
            //Do something if string
        }
        else if (o.GetType() == typeof(int))
        {
            // Do something else
        }
    }
1 голос
/ 29 марта 2017

Я думаю, перегрузка метода будет простым решением, если вы хотите держаться подальше от таких вещей, как отражение или проверка типов.

public void MethodName(string foo)
{
     int bar = 0;
     if(int.tryparse(foo))
        return MethodName(bar);//calls int overload
}
1 голос
/ 05 февраля 2011

Вы можете обернуть string и int в некоторую оболочку с интерфейсом маркера и передать их методу.

Что-то вроде этого

interface IMyWrapper<T> { T Value {get; }}
public class StringWrapper: IMyWrapper<string> { ... }
public class IntWrapper: IMyWrapper<int> { ... }

void MyMethod<T>(IMyWrapper<T> wrapper)
{
}
...