在通用方法中使用类型为Class的switch

时间:2019-02-04 23:43:00

标签: c# .net-4.5 c#-5.0

在以通用方法比较类时是否可以使用开关? 示例:

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))
{
   // ...
}

为简单起见,最好使用该开关。

3 个答案:

答案 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 Viswananswer上进行扩展,从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;
    }
}