在以通用方法比较类时是否可以使用开关? 示例:
switch (typeof(T))
{
case typeof(Class1):
// ...
break;
case typeof(Class2):
// ...
break;
default:
break;
}
这个想法不是使用名称,而是使用Class对象。 此刻我正在使用:
if (typeof(T) == typeof(Class1))
{
// ...
}
else if (typeof(T) == typeof(Class2))
{
// ...
}
为简单起见,最好使用该开关。
答案 0 :(得分:2)
在这种情况下,我使用字典,将lambda值配对以适合当前的特定问题。
var options = new Dictionary<Type, Action>()
{
{ typeof(string), () => doSomething() },
{ typeof(int), () => doSomething() },
...
};
Action act = null;
if (options.TryGetValue(typeof(T), out act) {
act();
} else {
// default
}
字典通常是static readonly
字段或属性,因此索引仅执行一次。
在您的特定情况下,您可以与Dictionary<Type, Func<object, string>>
相处,就像这样:
private static readonly Formatters = new Dictionary<Type, Func<object, string>>()
{
{ typeof(Class1), o => ((Class1)o).format() },
{ typeof(Class2), o => FormatClass.FormatClass2((Class2)o) },
...
};
T instance;
string formatted = Formatters[typeof(T)](instance);
答案 1 :(得分:0)
如果您使用的是C#7,则可以使用模式匹配。
例如,
public void Method<T>(T param)
{
switch(param)
{
case var _ when param is A:
Console.WriteLine("A");
break;
case var _ when param is B:
Console.WriteLine("B");
break;
}
}
哪里
public class A{}
public class B{}
答案 2 :(得分:0)
在Anu Viswan的answer上进行扩展,从C#7.1开始,这是有效的:
public void Method<T>(T param)
{
switch (param)
{
case A a:
Console.WriteLine("A");
break;
case B b:
Console.WriteLine("B");
break;
}
}