Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сложить два значаений которые находятся в переменных типа object. / 25 сообщений из 34, страница 1 из 2
13.03.2016, 03:15
    #39190758
dmitrybv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Добрый день.

Подскажите, как правильно дописать такой код.

object v1 = 1.1;
object v2 = 2;
System.Type dataType = typeof(Double);

object v3 = Convert.ChangeType(v1, dataType) + Convert.ChangeType(v2, dataType);

Надо преобразовать и сложить несколько значений (если значения совместимы).
Ссылка на значения существует в виде object.
Тип требуемого результата храниться в переменной dataType.

Компилятор C# говорит:
Operator '+' cannot be applied to operands of type 'object' and 'object'

Наверно надо как-то из dataType получить указатель на оператор +.
...
Рейтинг: 0 / 0
13.03.2016, 10:50
    #39190795
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
А зачем возня с Convert.ChangeType ?
Почему не сразу Convert.ToDouble ?
...
Рейтинг: 0 / 0
13.03.2016, 16:50
    #39190896
dmitrybv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Добрый день.

С точки зрения алгоритма значение в dataType заранее не известно.
...
Рейтинг: 0 / 0
13.03.2016, 17:42
    #39190917
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
dmitrybvС точки зрения алгоритма значение в dataType заранее не известно.
надеюсь, речь о числовых типах?
...
Рейтинг: 0 / 0
13.03.2016, 17:57
    #39190927
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
...
Рейтинг: 0 / 0
13.03.2016, 18:02
    #39190931
L.Otujktd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Преобразoвать в строку и использовать TryParse
...
Рейтинг: 0 / 0
13.03.2016, 19:07
    #39190947
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Код: c#
1.
2.
3.
4.
var v1 = 1.1;
var v2 = 2;

var v3 = v1 + v2;
...
Рейтинг: 0 / 0
13.03.2016, 19:53
    #39190968
dmitrybv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Такой код вызывает исключение на sumMethod.Invoke(
System.NullReferenceException occurred

Код: c#
1.
2.
3.
4.
5.
6.
      object v1 = 1.1;
      object v2 = 2;
      System.Type dataType = typeof(Double);
      MethodInfo sumMethod = dataType.GetMethod("op_Addition", BindingFlags.Static | BindingFlags.Public);

      object v3 = sumMethod.Invoke(null, new object[] { Convert.ChangeType(v1, dataType), Convert.ChangeType(v2, dataType) });
...
Рейтинг: 0 / 0
13.03.2016, 19:57
    #39190970
dmitrybv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Cat2
Код: c#
1.
2.
3.
4.
var v1 = 1.1;
var v2 = 2;

var v3 = v1 + v2;




var работает только если заранее известны типы переменных.
В реальной программе типы заранее не известны.
...
Рейтинг: 0 / 0
13.03.2016, 20:08
    #39190973
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
dmitrybv,

Код: c#
1.
2.
3.
Func<dynamic, dynamic, dynamic> summator = (x, y) => {return x + y;};

Console.WriteLine(summator(v1, v2));
...
Рейтинг: 0 / 0
13.03.2016, 20:20
    #39190978
dmitrybv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
buser,

dynamic доступен только в версии C# 4.
Код, скрее всего, будет использоваться в более ранних версиях C#.
...
Рейтинг: 0 / 0
13.03.2016, 20:40
    #39190982
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Код: c#
1.
2.
3.
4.
5.
object v1 = 1.1;
object v2 = 2;
if(v1 is Double && v2 is Double) Console.WriteLine((double)v1 + (double)v2); 
if(v1 is Double && v2 is Int32) Console.WriteLine((double)v1 + (Int32)v2); 
... и т.д. перебор всех возможных вариантов
...
Рейтинг: 0 / 0
13.03.2016, 20:56
    #39190988
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Dima T
Код: c#
1.
и т.д. перебор всех возможных вариантов


это перебор :)
...
Рейтинг: 0 / 0
13.03.2016, 20:57
    #39190989
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
dmitrybvКод, скрее всего, будет использоваться в более ранних версиях C#.
это что, не учебное задание ????
...
Рейтинг: 0 / 0
13.03.2016, 20:58
    #39190990
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Изопропил это перебор :)
почему? Числовых типов немного, 4 типа - 16 условий.
...
Рейтинг: 0 / 0
13.03.2016, 21:04
    #39190992
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Dima TИзопропил это перебор :)
почему? Числовых типов немного, 4 типа - 16 условий.
несколько больше -
sbyte->byte->short->ushort->int->uint->long->ulong->decimal->float->double

моделировать нужно стандартное приведение - https://msdn.microsoft.com/ru-ru/library/y5b434w4.aspx
...
Рейтинг: 0 / 0
13.03.2016, 21:21
    #39190999
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
ИзопропилDima Tпропущено...

почему? Числовых типов немного, 4 типа - 16 условий.
несколько больше -
sbyte->byte->short->ushort->int->uint->long->ulong->decimal->float->double

моделировать нужно стандартное приведение - https://msdn.microsoft.com/ru-ru/library/y5b434w4.aspx
тогда все целочисленные можно привести к Int64
Код: c#
1.
if(v1 is Double && (v2 is Int32 || v2 is UInt32 ...)) Console.WriteLine((double)v1 + (Int64)v2); 


Или просто привести каждое слагаемое к Double
...
Рейтинг: 0 / 0
13.03.2016, 22:18
    #39191014
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Dima Tтогда все целочисленные можно привести к Int64
ulong проблему вызовет

Dima TИли просто привести каждое слагаемое к Double
рискуем потерять точность для long/ulong
...
Рейтинг: 0 / 0
14.03.2016, 07:31
    #39191057
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
dmitrybv,

Вы бы описали всю задачу. Возможно объекты складвать не надо
...
Рейтинг: 0 / 0
14.03.2016, 10:30
    #39191169
dmitrybv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Cat2,

Задача, создать агрегирующие функции для столбцов грида и вывести результат в футере.
...
Рейтинг: 0 / 0
14.03.2016, 10:50
    #39191195
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
Можно развить эту концепцию:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        static void Main(string[] args)
        {
            Console.WriteLine(Add(1, 2));
            Console.WriteLine(Add(2.5, 3.51));
        }

        static object Add(object o1, object o2)
        {
            var body = Expression.Convert(
                Expression.Add(
                    Expression.Constant(o1),
                    Expression.Constant(o2)
                ),
                typeof(object)
            );

            return Expression.Lambda<Func<object>>(body).Compile()();
        }
...
Рейтинг: 0 / 0
14.03.2016, 11:30
    #39191226
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
dmitrybvCat2,

Задача, создать агрегирующие функции для столбцов грида и вывести результат в футере.
у столбца есть тип?
...
Рейтинг: 0 / 0
14.03.2016, 12:06
    #39191249
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
dmitrybvТакой код вызывает исключение на sumMethod.Invoke(
System.NullReferenceException occurred
Потому что int/double/float не используют перегруженные операторы сложения, а используют поддерживаемые на уровне CLR встроенные IL-инструкции. Поэтому op_Addition у них в приниципе нет.
...
Рейтинг: 0 / 0
14.03.2016, 14:41
    #39191411
dmitrybv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
ИзопропилdmitrybvCat2,

Задача, создать агрегирующие функции для столбцов грида и вывести результат в футере.
у столбца есть тип?

Тип запрашивается через свойство PropertyDescriptor.PropertyType
...
Рейтинг: 0 / 0
14.03.2016, 14:44
    #39191418
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложить два значаений которые находятся в переменных типа object.
dmitrybvCat2,

Задача, создать агрегирующие функции для столбцов грида и вывести результат в футере.
Зачем создавать, если есть готовые?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сложить два значаений которые находятся в переменных типа object. / 25 сообщений из 34, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]