3

例如:我有 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
4

2 回答 2

2

您可以使用IsAssignable

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

根据关于的评论intdouble我在评论中犯了一个错误,所以我删除了它。 int可以隐式转换为,double因为有预定义的隐式转换,请参见此处

有很多方法可以在类型之间进行转换或强制转换。例如,您可以使用隐式/显式转换,您可以使用TypeConverter或实现IConvertible接口。

现在,您必须决定哪个用例与您相关。检查它们可能有点复杂,尤其是在设计时不知道目标类型的情况下。

于 2017-12-26T08:10:46.547 回答
1

在您的代码片段中,type 是 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);   
}
于 2017-12-26T08:10:05.283 回答