这不会直接解决您的问题,因为您想要打开自己的用户定义类型,但为了其他只想打开内置类型的人的利益,您可以使用TypeCode枚举:
switch (Type.GetTypeCode(node.GetType())) { case TypeCode.Decimal: // Handle Decimal break; case TypeCode.Int32: // Handle Int32 break; ... }
@splattne不应将“ ...”作为代码的一部分,因为实际上“ ...”不是代码。不过,我可以看到一个论点,以使其更易于阅读。但是缩进...我不知道您怎么称呼它为“修复”,仅因为它就是您现在喜欢的方式。我没有看到有关如何缩进代码的任何StackOverflow准则。仅此问题就有各种各样的样式。 (2认同)
Anton Gogole.. 76
如果我真的不得不switch
使用对象类型,我会使用.ToString()
.但是,我会不惜一切代价避免它:IDictionary
会做得更好,访客可能是一个矫枉过正,但否则它仍然是一个非常好的解决方案.
这不会直接解决您的问题,因为您想要打开自己的用户定义类型,但为了其他只想打开内置类型的人的利益,您可以使用TypeCode枚举:
switch (Type.GetTypeCode(node.GetType())) { case TypeCode.Decimal: // Handle Decimal break; case TypeCode.Int32: // Handle Int32 break; ... }
如果我真的不得不switch
使用对象类型,我会使用.ToString()
.但是,我会不惜一切代价避免它:IDictionary
会做得更好,访客可能是一个矫枉过正,但否则它仍然是一个非常好的解决方案.
在MSDN博客文章中的许多问题:开启类型是关于为什么.NET不提供切换类型的一些信息.
像往常一样 - 变通办法始终存在.
这个不是我的,但不幸的是我失去了源头.它使得切换类型成为可能,但我个人认为它很尴尬(字典的想法更好):
public class Switch { public Switch(Object o) { Object = o; } public Object Object { get; private set; } } ////// Extensions, because otherwise casing fails on Switch==null /// public static class SwitchExtensions { public static Switch Case(this Switch s, Action a) where T : class { return Case(s, o => true, a, false); } public static Switch Case (this Switch s, Action a, bool fallThrough) where T : class { return Case(s, o => true, a, fallThrough); } public static Switch Case (this Switch s, Func c, Action a) where T : class { return Case(s, c, a, false); } public static Switch Case (this Switch s, Func c, Action a, bool fallThrough) where T : class { if (s == null) { return null; } T t = s.Object as T; if (t != null) { if (c(t)) { a(t); return fallThrough ? s : null; } } return s; } }
用法:
new Switch(foo) .Case(action => { doingSomething = FirstMethodCall(); }) .Case (action => { return false; })
我遇到了同样的问题并且发现了这篇文章.这是IDictionary方法的意思:
DictionarytypeDict = new Dictionary { {typeof(int),0}, {typeof(string),1}, {typeof(MyClass),2} }; void Foo(object o) { switch (typeDict[o.GetType()]) { case 0: Print("I'm a number."); break; case 1: Print("I'm a text."); break; case 2: Print("I'm classy."); break; default: break; } }
如果是这样,我不能说我喜欢将字典中的数字与case语句进行协调.
这将是理想的,但字典引用会杀死它:
void FantasyFoo(object o) { switch (typeDict[o.GetType()]) { case typeDict[typeof(int)]: Print("I'm a number."); break; case typeDict[typeof(string)]: Print("I'm a text."); break; case typeDict[typeof(MyClass)]: Print("I'm classy."); break; default: break; } }
还有其他我忽略的实现吗?
我只是使用if语句.在这种情况下:
Type nodeType = node.GetType();
if (nodeType == typeof(CasusNodeDTO))
{
}
else ...
另一种方法是:
if (node is CasusNodeDTO)
{
}
else ...
第一个示例仅适用于确切类型,后者也检查继承.
你可以这样做:
if (node is CasusNodeDTO) { ... } else if (node is BucketNodeDTO) { ... } ...
虽然那会更优雅,但它可能没有其他一些答案那么高效.
你可以这样做:
function void PrintType(Type t) { var t = true; new Dictionary{ {typeof(bool), () => Console.WriteLine("bool")}, {typeof(int), () => Console.WriteLine("int")} }[t.GetType()](); }
它很清楚,很容易.它比在某处缓存字典慢一点..但是对于很多代码来说这无关紧要..
一种方法是向NodeDTO添加纯虚拟GetNodeType()方法,并在后代中覆盖它,以便每个后代返回实际类型.