C# 如何处理对象类型切换?
在C#中,这个问题时不时地蔓延开来。通常我得到一个对象值,然后我必须为它调用“实”函数。大概是这样的:C# 如何处理对象类型切换?,c#,object,types,switch-statement,C#,Object,Types,Switch Statement,在C#中,这个问题时不时地蔓延开来。通常我得到一个对象值,然后我必须为它调用“实”函数。大概是这样的: if (type==typeof(byte)) val = rs.GetByte(col); else if (type==typeof(int)) val = rs.GetInt32(col); ... 或 我可以在这里看到一个文本模式,但我没有想出一个解决方案,可以一次性处理所有的脏活 您如何处理它?您收到对象值,您必须设置或传递它,但不是作为对象,而是具体类型(PODs,POD
if (type==typeof(byte))
val = rs.GetByte(col);
else if (type==typeof(int))
val = rs.GetInt32(col);
...
或
我可以在这里看到一个文本模式,但我没有想出一个解决方案,可以一次性处理所有的脏活
您如何处理它?您收到对象值,您必须设置或传递它,但不是作为对象,而是具体类型(PODs,PODs和string的null值)和
编辑
完成示例(这是问题的原因):
你可以使用策略模式。只需将每种类型的策略放在哈希表中,就不需要开关了。但是,每个策略需要一个类。如果您有复杂的逻辑,它尤其有用 如果逻辑相当简单,还可以使用包含委托的哈希表
//pseudo code
handlers.put(typeof(int), delegate(object value) { return something.GetInt32(value); });
//like this
var handler = handlers[type];
handler.Invoke(val);
你可以使用策略模式。只需将每种类型的策略放在哈希表中,就不需要开关了。但是,每个策略需要一个类。如果您有复杂的逻辑,它尤其有用 如果逻辑相当简单,还可以使用包含委托的哈希表
//pseudo code
handlers.put(typeof(int), delegate(object value) { return something.GetInt32(value); });
//like this
var handler = handlers[type];
handler.Invoke(val);
您可以使用is运算符稍微清理它:
if (MyType is BaseType)...
您可以使用is运算符稍微清理它:
if (MyType is BaseType)...
您需要有更完整的示例代码;实际上,什么
类型
和rs
和col
是不清楚的,它们之间的关系(或缺乏关系)也是不清楚的。@Mr E这并不总是可能的,特别是在处理简单类型或不同的对象层次结构时,你需要有更完整的示例代码;实际上,什么类型
和rs
和col
是不清楚的,它们之间的关系(或缺乏关系)也是不清楚的。@E先生,这并不总是可能的,特别是在处理简单类型或不同的对象层次结构时。你是说字典?我不认为它更紧凑,除非您使用某种调用方法名生成器并使用反射来获取方法并调用它。我的第一个例子类似于newmyswitcher(rs,“Get${TypeName}”),是的,我指的是一个字典,类型作为键,可能操作作为值。当然,您必须在初始化方法中填充字典。但它比许多开关更容易阅读和维护。另外,你也不需要思考。您可以在方法中包装几乎任何内容,也可以使用匿名委托。“这真是一种甜蜜的句法糖分。”Falcon,谢谢你——问题是,你必须为每种情况填充这本词典。它仍然有点难看(所以我不会自己用它,但谢谢你分享这个想法)。没有好的解决方案。当然,您可以对方法名称使用约定并使用反射,就像您前面所说的那样。这有助于生成漂亮、干净的代码,但可能会导致非常严重的运行时错误,并且可能会降低性能。p、 有时候你只需要写几行代码g@Falcon,运行时错误可能是个大问题,大家都同意,但尽管反射速度很快,但可以在构造函数调用中缓存所有方法。所以它会被解决一次(慢),然后被多次使用(快)。你是说字典?我不认为它更紧凑,除非您使用某种调用方法名生成器并使用反射来获取方法并调用它。我的第一个例子类似于newmyswitcher(rs,“Get${TypeName}”),是的,我指的是一个字典,类型作为键,可能操作作为值。当然,您必须在初始化方法中填充字典。但它比许多开关更容易阅读和维护。另外,你也不需要思考。您可以在方法中包装几乎任何内容,也可以使用匿名委托。“这真是一种甜蜜的句法糖分。”Falcon,谢谢你——问题是,你必须为每种情况填充这本词典。它仍然有点难看(所以我不会自己用它,但谢谢你分享这个想法)。没有好的解决方案。当然,您可以对方法名称使用约定并使用反射,就像您前面所说的那样。这有助于生成漂亮、干净的代码,但可能会导致非常严重的运行时错误,并且可能会降低性能。p、 有时候你只需要写几行代码g@Falcon,运行时错误可能是个大问题,大家都同意,但尽管反射速度很快,但可以在构造函数调用中缓存所有方法。所以它会被解决一次(慢),然后被多次使用(快)。谢谢你指出这一点,但主要问题仍然存在。这把我的整个生命藏在哪里了?谢谢你指出这一点,但主要问题仍然存在。这把我的整个生命藏在哪里了?