2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 36
1

Разные типы в обобщенном методе

28.06.2017, 20:33. Показов 1781. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Хочу написать следующий метод: подается массив типа int или string или object и тд, и элемент того же типа, что и массив. Использование классов, по понятным причинам, не допускается. Можно ли написать такой метод? Особенно, если учитывать, что в object можно поместить класс? И в object [] разные элементы могут иметь разный тип. И как проверить задан ли оператор "==" для сравнения двух элементов одного типа?
C#
1
2
3
4
5
6
7
8
9
10
        public static void MyVoid<T>(T[] array, T ob)
        {
            foreach (T el in array)
            {
                //var conv = el as ob; // Error CS0118  'ob' is a variable but is used like a type
                //if (el == ob) // Error    CS0019  Operator '==' cannot be applied to operands of type 'T' and 'T'
                if (el.ToString() == ob.ToString())
                    //TODO
            }
        }
Пока что придумал следующее решение, преобразовывать в string и сравнивать. Насколько это корректно?

И еще один метод. На вход подается object, который может быть классом или структурой, стандартным типом (string, int, object) или массивом из элементов стандартного типа. Необходимо определить, к чему из вышеперечисленному объект относится?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void MyVoid2<T>(T myOb)
        {
            Type type = myOb.GetType();
            // Для класса или структуры
            if ((((type.IsClass) || (type.IsValueType && !type.IsEnum && !type.IsPrimitive))) && (!type.IsArray))
            {
                MessageBox.Show("Является классом или структурой");
            }
 
            ////Для массивов, элементы которых не имеют тип класса
            if (type.IsArray) //&&!type.IsClass)
            {
                // Но в object можно поместить элемент типа Class!
                object[] val = myOb as object[];
 
                if (val != null)
                    MessageBox.Show("Является массивом");
            }
 
            // Для простых типов (string, int, double, object), которые не являются классами и массивами
            if (type.IsPrimitive && !type.IsArray && !type.IsEnum) //&& !type.IsClass
            {
                MessageBox.Show("Явл простым типом");
            }
 
         }
Начал проверять, и понял, что я не учел некоторые моменты:

C#
1
2
3
            object[] ob = new object[1];
            ob[0] = 121;
            //ob.GetType().IsClass вернет True
C#
1
2
            string b = "";
            //b.GetType().IsClass вернет True
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2017, 20:33
Ответы с готовыми решениями:

Как сделать разные типы возвращаемых значений в одном методе
как сделать разные типы возвращаемых значений в одном методе? public static DateTime...

Как привести (состыковать) разные типы из разных классов (исп в качестве выходного параметра в методе)
Вопрос состоит в том как максимально просто заставить работать такой неправильный код. Самое...

Как в обобщенном методе указать ограничения для конструктора?
Вот например я хочу создать Класс в котором я буду в основном работать с двумя типами, один из...

Преобразование типов в обобщенном методе
Всем доброго времени суток. public static void Metod&lt;T&gt;(T a1) where T: struct // Какое...

7
Эксперт .NET
1829 / 1337 / 427
Регистрация: 10.06.2011
Сообщений: 2,124
29.06.2017, 09:39 2
Здравствуйте, Alex_rt. Вы написали много текста по решению вашей проблемы. Но, к сожалению вы не написали, что это за проблема и какой цели вы хотите достичь.
Цитата Сообщение от Alex_rt Посмотреть сообщение
Хочу написать следующий метод
Хотеть мало, нужно написать, зачем вы его хотите написать.
Цитата Сообщение от Alex_rt Посмотреть сообщение
Насколько это корректно?
Я думаю, что то, что вы пытаетесь сделать не является правильным решением. Однако ЧТО ИМЕННО вы хотите сделать и ЗАЧЕМ, остаётся непонятным. А без ответов на эти вопросы помочь вам будет сложно.
0
2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 36
29.06.2017, 10:52  [ТС] 3
novikov.ea, да, вы правы.
Первый метод лучше разбить на два метода. В первом элемент массива и переменную переводить в string и тогда можно будет сравнивать, например "1" и 1.ToString().
А во втором методе лучше использовать T[] и V. Т.е. изначально типы будут разные, а потом проверять можно ли привести элемент массива к типу V, и если можно, тогда сравнивать.
И все же, как ограничить типы входных переменных, например, T ob так что бы нельзя было туда передать класс, но можно было бы передавать элементы типа int, string, object ?

А во втором методе, нужно определить к чему относится тип входной (T myOb) переменной: класс и структура, массив НЕ классов, одна переменная типа int, string, object и тд.
0
Эксперт .NET
1829 / 1337 / 427
Регистрация: 10.06.2011
Сообщений: 2,124
29.06.2017, 12:13 4
Опять двадцать пять)
Цитата Сообщение от novikov.ea Посмотреть сообщение
вы не написали, что это за проблема и какой цели вы хотите достичь.
Цитата Сообщение от novikov.ea Посмотреть сообщение
ЧТО ИМЕННО вы хотите сделать и ЗАЧЕМ?
Ответьте, пожалуйста, на вопрос, используя шаблон:
(Напишите, о чём вы думали до того, как решили написать какой-либо метод)
Я решаю такую задачу: _________
(Вы решили, что вашу задачу можно решить с помощью некого метода. И решили написать его)
Метод должен делать следующее: _________
1
1217 / 1005 / 259
Регистрация: 15.06.2012
Сообщений: 3,897
29.06.2017, 16:25 5
Цитата Сообщение от Alex_rt Посмотреть сообщение
И как проверить задан ли оператор "==" для сравнения двух элементов одного типа?
Возможно достаточно заюзать Equals (только не забывайте проверку на null)

Цитата Сообщение от Alex_rt Посмотреть сообщение
Использование классов, по понятным причинам, не допускается.
Оно? Ограничения параметров типа (Руководство по программированию на C#)

Цитата Сообщение от Alex_rt Посмотреть сообщение
преобразовывать в string и сравнивать. Насколько это корректно?
Можно без проблем получать индуское гражданство.

По второму вопросу, сначала проверяйте, не является ли входной обьект массивом, если нет -- ваши проверки. Для массива гуглите как выдернуть тип.
1
2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 36
30.06.2017, 21:38  [ТС] 6
Цитата Сообщение от Wolfdp Посмотреть сообщение
Возможно достаточно заюзать Equals (только не забывайте проверку на null)
Да! это то что нужно.
Цитата Сообщение от Wolfdp Посмотреть сообщение
Оно? Ограничения параметров типа (Руководство по программированию на C#)
Итого, в качестве ограничения можно выбрать только: класс, структура, наличие конструктора без параметров и тд.
И при помощи ограничения я не смогу ограничить так как хотелось бы(
0
1217 / 1005 / 259
Регистрация: 15.06.2012
Сообщений: 3,897
30.06.2017, 23:02 7
Цитата Сообщение от Alex_rt Посмотреть сообщение
И при помощи ограничения я не смогу ограничить так как хотелось бы(
можно чуть подробней? Просто из описания выше, там перечислялись все структурные типы. Или нужно именно значемые, которые можно задавать в константах?
0
2 / 2 / 1
Регистрация: 12.01.2017
Сообщений: 36
02.07.2017, 23:58  [ТС] 8
Wolfdp, данную проверку я надеюсь использовать для разных методов, например, для использования рефлексии.
Итого нашел следующее решение:
C#
1
if (Assembly.GetAssembly(ob.GetType()).Location != "mscorlib")
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2017, 23:58
Помогаю со студенческими работами здесь

Разные типы
Как правельно преобразовать здесь типы для probability и PMAX, PMAX1, JMAX, JMAX1. Вот код: ...

Go и разные типы ОС
Доброго времени суток! Подскажите пожалуйста программа написанная на Go может работать и на Windows...

Разные типы данных
Нужно выполнить простое вычитание одного слагаемого из другого. Проблема в том, что первое задано...

Разные типы заявок
как изменить программно в Delay время задержки? например, необходимо если агент с параметром...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru