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