使用Case / Switch和GetType来确定对象
可能重复:
C# - 有没有比'开启类型'更好的选择?
如果你想switch
一个类型的对象,最好的办法是什么?
代码片段
private int GetNodeType(NodeDTO node)
{
switch (node.GetType())
{
case typeof(CasusNodeDTO):
return 1;
case typeof(BucketNodeDTO):
return 3;
case typeof(BranchNodeDTO):
return 0;
case typeof(LeafNodeDTO):
return 2;
default:
return -1;
}
}
我知道这种方式不行,但我想知道你如何解决这个问题。 在这种情况下, if/else
语句是否恰当?
或者你使用开关并将.ToString()
添加到类型?
如果我真的必须switch
对象的类型,我会使用.ToString()
。 然而,我会不惜一切代价避免它: IDictionary<Type, int>
会做得更好,访问者可能是一种矫枉过正,但否则它仍然是一个完美的解决方案。
这不会直接解决您的问题,因为您希望切换自己的用户定义类型,但为了其他只想打开内置类型的用户的利益,可以使用TypeCode枚举:
switch (Type.GetTypeCode(node.GetType()))
{
case TypeCode.Decimal:
// Handle Decimal
break;
case TypeCode.Int32:
// Handle Int32
break;
...
}
在MSDN博文中有许多问题:切换类型是为什么.NET不提供类型切换的一些信息。
像往常一样 - 变通办法始终存在。
这不是我的,但不幸的是我已经失去了消息来源。 它使得切换类型成为可能,但我个人认为它很尴尬(字典的想法更好):
public class Switch
{
public Switch(Object o)
{
Object = o;
}
public Object Object { get; private set; }
}
/// <summary>
/// Extensions, because otherwise casing fails on Switch==null
/// </summary>
public static class SwitchExtensions
{
public static Switch Case<T>(this Switch s, Action<T> a)
where T : class
{
return Case(s, o => true, a, false);
}
public static Switch Case<T>(this Switch s, Action<T> a,
bool fallThrough) where T : class
{
return Case(s, o => true, a, fallThrough);
}
public static Switch Case<T>(this Switch s,
Func<T, bool> c, Action<T> a) where T : class
{
return Case(s, c, a, false);
}
public static Switch Case<T>(this Switch s,
Func<T, bool> c, Action<T> 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<Fizz>
(action => { doingSomething = FirstMethodCall(); })
.Case<Buzz>
(action => { return false; })
链接地址: http://www.djcxy.com/p/84409.html