C# - 将对象转换为int而不进行强制转换

时间:2015-03-21 07:44:01

标签: c#

我有一个方法,它根据给定的列(数据库类)返回一种对象。但是,当我分配对象时,编译器会抛出一个错误,说它不能隐式地将对象类型转换为int。如何在不进行转换的情况下转换它?

它看起来更好:

this.Id = datum["Id"];

但是现在我必须包含一个强制转换,这使得代码不那么干净且难以编码:

this.Id = (int)datum["Id"];

这是我的代码:

public object this[string name]
    {
        get
        {
            object result;

            if (this.Dictionary.ContainsKey(name))
            {
                if (this.Dictionary[name] is DBNull)
                {
                    result = null;
                }
                else if (this.Dictionary[name] is byte && Meta.IsBool(this.Table, name))
                {
                    result = (byte)this.Dictionary[name] > 0;
                }
                else
                {
                    result = this.Dictionary[name];
                }
            }
            else
            {
                result = default(object);
            }

            return result;
        }
        set
        {
            if (value is DateTime)
            {
                if (Meta.IsDate(this.Table, name))
                {
                    value = ((DateTime)value).ToString("yyyy-MM-dd");
                }
                else if (Meta.IsDateTime(this.Table, name))
                {
                    value = ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss");
                }
            }

            if (this.Dictionary.ContainsKey(name))
            {
                this.Dictionary[name] = value;
            }
            else
            {
                this.Dictionary.Add(name, value);
            }
        }
    }

4 个答案:

答案 0 :(得分:3)

可以将您的索引器签名更改为:

public dynamic this[string name]

然后,这将使转换在执行时动态化。

就个人而言,我更喜欢演员阵容。它清楚地表明这可能会失败 - 您告诉编译器您有可用的信息。

顺便说一句,您可以更简单地编写代码,利用Dictionary<,>.TryGetValue和字典索引器的行为进行设置:

public object this[string name]
{
    get
    {
        object result;
        if (Dictionary.TryGetValue(name, out result))
        {
            if (result is DBNull)
            {
                result = null;
            }
            else if (result is byte && Meta.IsBool(this.Table, name))
            {
                result = (byte) result > 0;
            }
        }
        return result;
    }
    set
    {
        // TODO: Byte/bool conversions?

        if (value is DateTime)
        {
            // Note use of invariant culture here. You almost certainly
            // want this, given the format you're using. Preferably,
            // avoid the string conversions entirely, but...
            DateTime dateTime = (DateTime) value;
            if (Meta.IsDate(this.Table, name))
            {
                value = dateTime.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
            }
            else if (Meta.IsDateTime(this.Table, name))
            {
                value = dateTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
            }
        }

        Dictionary[name] = value;
    }
}

答案 1 :(得分:1)

使用课程Convert

Convert.ToInt32(datum["Id"]);

答案 2 :(得分:0)

如果您不需要在代码中说明要从object转换为int,那么编程语言就不会帮助您避免错误。

C#确实有一个功能,你可以关闭特定变量的静态类型检查:让你的索引器返回dynamic

public dynamic this[string name]

然后你就可以说:

int n = datum["Id"];

但缺点是你不会发现这是否正确,直到运行时。

答案 3 :(得分:0)

您可以执行扩展方法。

创建一个这样的类。

public static class ExtensionMethods
{
    public static int AsInt(this object obj)
    {
        return (int)obj; // add additional code checks here
    }
}

然后在您的实际代码中,您所要做的就是像这样调用扩展方法。

this.Id = datum["Id"].AsInt();

我知道这可能看起来与演员表相同,但它发生在方法调用AsInt下面,而且您的代码更清晰,更易于阅读,因为AsInt流畅且明确。