如何比较C#中的2个相似类型

时间:2015-07-30 10:45:48

标签: c#

我想问一下我们如何在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>)会有所不同。

抱歉我的英文不好

1 个答案:

答案 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);
    }
}