你如何处理对象类型切换?

时间:2011-05-07 12:48:27

标签: c# object types switch-statement

在C#中,问题不时出现。通常我得到一个对象值,然后我必须为它调用“真正的”函数。像这样:

if (type==typeof(byte))
  val = rs.GetByte(col);
else if (type==typeof(int))
  val = rs.GetInt32(col);
...

if (type==typeof(byte))
  Call((byte)val);
else if (type==typeof(int))
  Call((int)val);
...

我可以在这里看到一个文本模式,但我没有提出解决方案,它可以解决所有肮脏的工作。

你如何处理?你收到了对象值,你必须设置或传递它,但不能作为对象,而是具体类型(POD,POD和字符串的Nullable)和。 ..?

编辑

完成示例(这是问题的原因):

    protected IRecord ReadRecord()
    {
        if (!ResultSet.Read())
            return null;

        IRecord record = CreateIRecord();

        var type = record.GetType();
        int column = -1;

        foreach (var prop in type.GetProperties())
        {
            ++column;
            object val;

            if (prop.PropertyType == typeof(byte))
                val = ResultSet.GetByte(column);
            else if (prop.PropertyType == typeof(byte?))
                val = ResultSet.GetSqlByte(column).ToNullable();
            else if (prop.PropertyType == typeof(int))
                val = ResultSet.GetInt32(column);
            else if (prop.PropertyType == typeof(int?))
                val = ResultSet.GetSqlInt32(column).ToNullable();
            else if (prop.PropertyType == typeof(double))
                val = ResultSet.GetDouble(column);
            else if (prop.PropertyType == typeof(double?))
                val = ResultSet.GetSqlDouble(column).ToNullable();
            else if (prop.PropertyType == typeof(DateTime))
                val = ResultSet.GetDateTime(column);
            else if (prop.PropertyType == typeof(DateTime?))
                val = ResultSet.GetSqlDateTime(column).ToNullable();
            else if (prop.PropertyType == typeof(string))
                val = ResultSet.GetString(column);
            else
                throw new ArgumentException("Invalid property type {0}".Expand(prop.PropertyType.ToString()));

            prop.SetValue(record, val, null);
        }

        return record;


    }

2 个答案:

答案 0 :(得分:2)

您可以使用策略模式。只需将每种类型的策略放在哈希表中,然后就不需要开关了。但是,每个策略需要一个类。如果你有复杂的逻辑,它会特别有用。

如果逻辑非常简单,您还可以使用包含委托的Hashtable。

//pseudo code
handlers.put(typeof(int), delegate(object value) { return something.GetInt32(value); });

//like this
var handler = handlers[type];
handler.Invoke(val);

答案 1 :(得分:2)

你可以使用is运算符清理一下:

if (MyType is BaseType)...