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

在C#中,这个问题时不时地蔓延开来。通常我得到一个对象值,然后我必须为它调用“实”函数。大概是这样的:

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,运行时错误可能是个大问题,大家都同意,但尽管反射速度很快,但可以在构造函数调用中缓存所有方法。所以它会被解决一次(慢),然后被多次使用(快)。谢谢你指出这一点,但主要问题仍然存在。这把我的整个生命藏在哪里了?谢谢你指出这一点,但主要问题仍然存在。这把我的整个生命藏在哪里了?