Как использовать тип переменной в качестве оператора

Например: у меня есть 2 переменные (значение) и (свойство), которые я хочу проверить, возможно ли приведение к значению? Мы не знаем тип переменных, Как проверить, возможно ли приведение?

   var value = Reader[item];
   PropertyInfo property = properties.Where(x => x.Name == item).FirstOrDefault();
   var type=property.PropertyType;//Or property.ReflectedType
   var cs= value as type // Error: type is variable but is used like a Type
   if (cs!=null){
     ...
    }

Образец 1:

var value = 123;//is int
type = property.GetType();// is double
var x = (double)value;//Can be casted

Образец 2:

var value = "asd";//is string
type = property.GetType();// is double
var x = (double)value;//Can not be casted

person masoud    schedule 26.12.2017    source источник
comment
если вы не знаете тип переменных, вам нужно будет использовать отражение или тип dynamic.   -  person Ousmane D.    schedule 26.12.2017
comment
@Aominè А можно взять пример?   -  person masoud    schedule 26.12.2017
comment
Вы можете использовать Expression.Convert, как описано здесь: stackoverflow.com/a/3647134/5311735   -  person Evk    schedule 26.12.2017


Ответы (2)


Вы можете использовать IsAssignable :

bool isValidCast = type.IsAssignableFrom(value.GetType())

Что касается комментариев от int до double: я сделал ошибку в своем комментарии, поэтому удалил его. int можно неявно преобразовать в double, поскольку существует предопределенное неявное преобразование, см. здесь

Существует множество способов преобразования или преобразования типа в тип. Например, вы можете использовать неявное/явное преобразование, вы можете использовать TypeConverter или реализовать интерфейс IConvertible.

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

person Ofir Winegarten    schedule 26.12.2017
comment
в этом примере type.IsAssignableFrom возвращает false, но приведение возможно: int value = 123; double property = 123.200; var type = property.GetType(); bool isValidCast = type.IsAssignableFrom(value.GetType());// false var x = (double)value;//Can be casted - person masoud; 26.12.2017

В вашем фрагменте кода тип является переменной типа Type, поэтому он выдает эту ошибку. Вы можете изменить свой код, чтобы вместо этого использовать Convert.ChangeType(). Что-то вроде этого:

   var value = Reader[item];
   PropertyInfo property = properties.Where(x => x.Name == item).FirstOrDefault();
   var type=property.PropertyType;
   object cs= Convert.ChangeType(value, type);
   if (cs!=null){
     ...
    }

Обратите внимание, что, поскольку вы не знаете сильный тип вашего свойства во время компиляции, вам все равно придется упаковывать его в тип объекта после изменения его типа. Это означает, что вы не сможете получить доступ к его свойствам и методам напрямую, используя точечный синтаксис в коде (например, cs.MyProperty). Если вы хотите сделать это, вы можете использовать динамический тип в C#:

dynamic dcs = cs;
Console.Write(dcs.MyProperty);

При использовании Convert.ChangeType() вы должны убедиться, что конвертируете в правильный тип. Например.:

if (value.GetType() == type)
{
   object cs= Convert.ChangeType(value, type);   
}
person Sepehr Samiei    schedule 26.12.2017
comment
в Convert.ChangeType() Если его нельзя привести, возникает ошибка - person masoud; 26.12.2017
comment
Да, если, например, вы попытаетесь преобразовать строку в int, она выдаст ошибку. Но если, например, вы конвертируете int, который находится внутри объекта, он будет работать отлично. - person Sepehr Samiei; 26.12.2017
comment
Вы должны быть более конкретными о вашей проблеме. Вы установили реальный тип вашей переменной? Из вашего фрагмента кода неясно, как значение переменной связано со свойством и его свойством.PropertyType. Возможно, вы получили значение из какого-то источника, который возвращает его в виде строки или в другом формате. В этом случае вы должны использовать другие методы для преобразования его в желаемый тип. - person Sepehr Samiei; 26.12.2017
comment
Предположим, что значение — int value=123, а тип — double. значение имеет возможность двойного приведения. но if (value.GetType() == type) не дает приведения - person masoud; 26.12.2017
comment
Числовые типы являются единственными исключениями на уровне языка. Вы можете обрабатывать этот особый случай в своем коде. Например: если (typeof(value) is int || typeof(value) is double)... - person Sepehr Samiei; 26.12.2017