如何在运算符中使用变量类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在运算符中使用变量类型相关的知识,希望对你有一定的参考价值。

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

你可以使用IsAssignable

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

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

有许多方法可以从类型转换或转换为类型。例如,您可以使用implicit/explicit conversion,您可以使用TypeConverter或实现IConvertible接口。

现在,您必须确定哪个用例与您相关。检查它们可能有点复杂,特别是在设计时不知道目的地类型。

另一答案

在您的代码片段中,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);   
}

以上是关于如何在运算符中使用变量类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django模板中添加,乘以数字变量?

Android 上的 Kotlin:如何在片段中使用数据库中的 LiveData?

如何在MATLAB中获取变量的类型

如何创建片段以重复变量编号中的代码行

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

如何在导航抽屉活动模板中的片段之间传递字符串变量