可以"是"运算符在c#中被分解?

时间:2015-10-27 09:59:15

标签: c#

我想在条件语句中使用is运算符。我的代码是这样的:

 public static string returnProperColumnValue(string columnName, object columnValue)
 {
    if (columnValue is int || columnValue is float || columnValue is long || ..... ))
    {
        return columnValue.ToString();
    }
    else if (columnValue is string)
    {
        return "'" + columnValue + "'";
    }
    else if (columnValue.GetType().IsGenericType && columnValue is IDictionary)
    {
        var dictionaryType = columnValue.GetType().GetGenericArguments().First().Name;

        //to do
        return "";
    }
    else if (columnValue.GetType().IsGenericType && (columnValue is IEnumerable))
    {
        var listType = columnValue.GetType().GetGenericArguments().Single().Name;

        if (listType is int || ....... )
            return columnName + "+" + "[" + columnValue.ToString() + "]";
        else if (listType is string)
            return columnName + "+" + "{'" + columnValue.ToString() + "'} ";
    }
    return "";
}

我想检查variable types子句中的大量if。 因此,我想以更短的方式使用is运算符:

public void properColumnValue(object columnValue)
{
    if (columnValue is ( int || decimal || ... ) )
    {
        //do stuff for int
    } 

    //other conditions
}

是否可以将is操作分解?

3 个答案:

答案 0 :(得分:4)

不,is运算符不能像这样考虑因素。也许您可以使用IsInstanceOfType方法,该方法是System.Type的成员:

public void properColumnValue(object columnValue)
{
    Type[] types = new[] {typeof (int), typeof (decimal), typeof (long)};

    bool b = types.Any(x => x.IsInstanceOfType(columnValue));
    if (b)
    {
        // do stuff
    }
}

答案 1 :(得分:0)

除了Kapol的想法,您还可以使用Contains方法查看columnValue中包含的值的实际类型是否是数组的成员:

public void properColumnValue(object columnValue)
{
    Type[] number_types = new[] {typeof (int), typeof (decimal), typeof (long)};
    if (number_types.Contains(columnValue?.GetType()))
    {
        // convert to long, or whatever you need it to be:
        long value = Convert.ToInt64(columnValue);
        //... do something with the value
    }
}

或者你可以在类级别创建一个static readonly数组来加快速度:

static readonly Type[] number_types = new[] {typeof (int), typeof (decimal), typeof (long)};
public void properColumnValue(object columnValue)
{
    if (number_types.Contains(columnValue?.GetType()))
    {
        // convert to long, or whatever you need it to be:
        long value = Convert.ToInt64(columnValue);
        //... do something with the value
    }
}

至少你只需要创建一次数组。

答案 2 :(得分:0)

每个逻辑操作都需要左侧和右侧参数,而is运算符不是您不能使用的方法,如columnValue is ( int || decimal || ...)

您可以为此创建自定义扩展方法,并将类型(或类型的字符串名称)作为参数传递:

public static class Helper
{
    static Dictionary<string, Type> _types = new Dictionary<string, Type>()
    {
        {"int", typeof(int)}, {"string", typeof(string)}, 
        {"double", typeof(double)}, {"decimal", typeof(decimal)},             
        // ... etc
    };

    public static bool Is<T>(this T instance, params string[] types)
    {
        Type iType = instance.GetType();
        for (int i = 0; i < types.Length; i++)
            if (_types.ContainsKey(types[i]) && _types[types[i]] == iType)
                return true;

        return false;
    }
}

并使用它:

public void properColumnValue(object columnValue)
{
    if (columnValue.Is("int", "decimal", "double") ... ))
    {
        //do stuff for int, decimal or double
    } 
}