例如:我有2个变量(value)&(属性)我想检查是否可以进行价值?我们不知道变量的类型,如何检查是否可能进行铸造?
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())
根据int
到double
的评论:我在评论中犯了一个错误,所以我删除了它。 int
可以隐式转换为double
,因为有一个预定义的隐式转换,请参见此处
有很多方法可以将类型转换为类型。例如,您可以使用隐式/显式转换,可以使用TypeConverter
或实现IConvertible
接口。
现在,您必须确定哪种用例与您有关。检查它们可能有点复杂,尤其是在设计时不知道目的地类型的情况下。
在您的代码段中,类型是类型类型的变量,因此为什么会抛出该错误。您可以更改代码以使用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){
...
}
请注意,由于您在编译时不知道属性的强大类型,因此在更改其类型后仍必须将其装入对象类型中。这意味着您将无法使用代码中的DOT语法直接访问其属性和方法(例如cs.myproperty)。如果您希望能够做到这一点,则可以在C#中使用动态类型:
dynamic dcs = cs;
Console.Write(dcs.MyProperty);
使用convert.changetype()时,必须确保要转换为正确的类型。例如:
if (value.GetType() == type)
{
object cs= Convert.ChangeType(value, type);
}