Использование C# 4.0, есть ли способ разрешить метод (без создания перегрузки) принять строку или int, а затем разрешить мне определить, какой тип был передан?Как разрешить метод принимать строку или int?
ответ
Поскольку вы используете C# 4.0, вы можете написать generic method. Например:
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
}
}
Но вы должны очень серьезно подумать над тем, действительно ли это хорошая идея. Вышеприведенный пример - это немного запаха кода. На самом деле, вся цель дженериков должна быть generic. Если у вас есть специальный код вашего кода в зависимости от типа переданного объекта, это знак, который вы должны использовать перегрузку. Таким образом, каждый метод перегрузки обрабатывает свой уникальный случай. Я не могу представить себе недостатка в этом.
+1 для объяснения лучшей практики –
+1 Я согласен с Коди. Пожалуйста, используйте перегрузки, если это возможно! – Bebben
Согласитесь с запахом вокруг примера; здесь есть две перегрузки. –
Уверен, что вы можете! Примером этого является
public void MyMethod(object o)
{
if (o.GetType() == typeof(string))
{
//Do something if string
}
else if (o.GetType() == typeof(int))
{
// Do something else
}
}
Вы можете сделать это так, но это накладывает штраф за производительность, потому что 'int' помещается в« объект ». Поскольку вопросник использует C# 4.0, дженерики - намного лучший вариант. –
Вы можете обернуть строку и Int в некоторой обертке с маркером интерфейсом и передать их методу.
Что-то вроде этого
interface IMyWrapper<T> { T Value {get; }}
public class StringWrapper: IMyMarker<string> { ... }
public class IntWrapper: IMyMarker<int> { ... }
void MyMethod<T>(IMyWrapper<T> wrapper)
{
}
Почему в мире вы бы это сделали, вместо того, чтобы писать общий метод? –
Код Серый, если вы можете показать мне хороший пример, как я могу ограничить общий метод * int * и * double * только без исключения исключения во время выполнения, тогда я бы этого не сделал. –
Я не уверен, почему исключение во время выполнения будет проблемой. Если вы * пропустили * запрещенный тип к рассматриваемому методу, вы бы * хотели бы * поймать это во время отладки, поэтому исключение во время выполнения кажется идеальным. Этот случай будет проблемой в вашем коде. * Исключительно * редко, что конечный пользователь динамически вызывает ваш метод и задает произвольный тип данных. И даже если это так, что происходит в вашем сценарии? Они по-прежнему получают ошибку во время выполнения: подпись метода не совместима с указанными аргументами. –
Я думаю, что перегрузка метод был бы простым решением, если вы хотите, чтобы держаться подальше от вещей, как отражение или проверки типов.
public void MethodName(string foo)
{
int bar = 0;
if(int.tryparse(foo))
return MethodName(bar);//calls int overload
}
- 1. Разрешить метод принимать массив
- 2. Разрешить метод принимать: id param
- 3. «Невозможно разрешить метод» addPreferencesFromResource (int) »«
- 4. Разрешить параметру принимать нулевую или пустую строку PowerShell
- 5. Невозможно разрешить метод setVisibility (int)
- 6. Как разрешить метод принимать два типа данных в качестве аргумента?
- 7. Как разрешить функции сканирования принимать пустую строку в r?
- 8. «Не удается разрешить метод openFileOutput (Java.lang.String, int)» «
- 9. java «Невозможно разрешить метод» setCharAt (int, char) '»
- 10. Невозможно разрешить метод findViewById (Int) 'в фрагменте
- 11. Не удается разрешить метод openFileOutput (java.lang.String, int)
- 12. Как разрешить метод addView (View, int, LinearLayout.LayoutParams) типа YourLayout должен переопределить или реализовать метод супертипа
- 13. Android - Не удается разрешить метод 'onActivityResult (int, int, android.content.Intent)
- 14. Как принимать символ или строку в качестве входных данных
- 15. Как разрешить временным таблицам принимать нулевые значения
- 16. Как принимать 3 аргументы как Int
- 17. Несовместимые INT в строку (getLast() метод)
- 18. Как разрешить iFrame принимать событие ondblclick?
- 19. Как разрешить JSONWriter принимать XML-форматированный ключ?
- 20. Как разрешить Postgres принимать удаленные подключения
- 21. Как разрешить NSMutableDictionary принимать значения «nil»?
- 22. Как разрешить bootbox принимать несколько строк кода?
- 23. Как преобразовать строку в int или десятичную?
- 24. Как заставить устройство запоминать int или строку
- 25. Как изменить строку или int в Rational?
- 26. Умный метод для преобразования int в строку?
- 27. Как передать int или строку аргументу командной строки
- 28. Android - пинг, не удается разрешить метод "findViewById (INT)"
- 29. Как разрешить параметр функции принимать различные типы объектов?
- 30. Как создать общую функцию, возвращающую int или дату или строку
Это именно то, для чего предназначены перегруженные методы. Почему вы против их использования? –
Согласен с Коди. Это можно сделать, но это не может быть сделано очень красиво. И у меня, и у Коди есть два предложения ниже, но это не очень хороший способ сделать это, действительно. – Bebben
Спасибо Коди. Я не против, я просто хотел убедиться, что я не пропустил простую, новую функцию в 4.0, которая позволила бы это сделать. Поскольку теперь возможно делать необязательные и названные типы, я подумал, что, возможно, появился новый чистый способ сделать это. Благодаря! – user390480