您可以创建一个Dictionary<Type, Action<object>>
并存储类型(从GetType
方法返回值a
以及执行您希望为给定类型运行的任何代码的委托。
例如,看看这个:
private readonly Dictionary<Type, Action<object>> typeActions = new Dictionary<Type, Action<object>>()
{
{ typeof(int), (a) => { Console.WriteLine(a.ToString() + " is an integer!"); } },
{ typeof(float), (a) => { Console.WriteLine(a.ToString() + " is a single-precision floating-point number!"); } }
};
然后可以在您的代码中的其他地方使用此字典:
Action<object> action;
if (typeActions.TryGetValue(a.GetType(), out action)) {
action(a);
}
请注意,您仍然必须a
在您的操作中强制转换为适当的类型。
编辑:正如克里斯正确指出的那样,这将无法识别a.GetType()
是否a
属于已注册类型的子类。如果需要包含它,您将不得不遍历类型层次结构:
Action<object> action = null;
for (Type t = a.GetType(); t = t.BaseType; t != null) {
if (typeActions.TryGetValue(t, out action)) {
break;
}
}
if (action != null) {
action(a);
}
如果您需要涵盖泛型类型和/或接口,这也是可行的,但代码会变得越来越复杂。