我想问一下我们如何在C#中比较两种类型。
我的情景是:
Nullable<int> Rating;
int NeedCompareType;
每当我比较这两个时,它都会返回错误的结果。
无论如何,在这种情况下我都会返回true,因为int
类型在两行中都有。
我的比较行是:
if(Rating.GetType() == NeedCompareType.GetType())
编辑: 实际上这是我的程序代码:
public object this[string propertyName]
{
get
{
PropertyInfo property = GetType().GetProperty(propertyName);
return property.GetValue(this, null);
}
set
{
PropertyInfo property = GetType().GetProperty(propertyName);
IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);
if (property.PropertyType == typeof(System.DateTime))
{
property.SetValue(this, Convert.ToDateTime(value, culture), null);
}
else if (property.PropertyType == typeof(int))
{
property.SetValue(this, Int32.Parse((string)value));
}
else
{
property.SetValue(this, value, null);
}
}
}
此代码的目的是将Controller从浏览器接收的值转换为String类型,然后我想将String类型转换为模型的unknown yet
属性的正确类型(在此案例是public Nullable<int> Rating { get; set; }
)。
如果你知道我想要propertyName = "Rating"
,它应该执行第二个if语句,但它不会,因为typeof(int)
和typeof(Nullable<int>)
会有所不同。
抱歉我的英文不好
答案 0 :(得分:4)
实际上,这一行:
if(Rating.GetType() == NeedCompareType.GetType())
总是会进入条件,或者抛出NullReferenceException
- 因为Rating.GetType()
会将Rating
框住Int32
或空引用。
现在,如果您要比较typeof(int)
和typeof(Nullable<int>)
,可以使用:
public bool SomewhatEqual(Type t1, Type t2)
{
return t1 == t2 ||
t1 == Nullable.GetUnderlyingType(t2) ||
Nullable.GetUnderlyingType(t1) == t2;
}
现在我们已经看到了你真正感兴趣的代码,听起来你只想用可空类型处理每个属性,就好像它是不可为空的。这很简单:
set
{
PropertyInfo property = GetType().GetProperty(propertyName);
Type type = property.GetType();
// Treat nullable types as their underlying types.
type = Nullable.GetUnderlyingType(type) ?? type;
// TODO: Move this to a static readonly field. No need to
// create a new one each time
IFormatProvider culture = new CultureInfo("fr-FR", true);
if (type == typeof(System.DateTime))
{
property.SetValue(this, Convert.ToDateTime(value, culture), null);
}
else if (type == typeof(int))
{
property.SetValue(this, Int32.Parse((string)value));
}
else
{
property.SetValue(this, value, null);
}
}