Используйте переключатель с типом Class в универсальном методе - PullRequest
0 голосов
/ 05 февраля 2019

Можно ли использовать переключатель при сравнении классов в общем методе?Пример:

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 голосов
/ 05 февраля 2019

Если вы используете 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{}
0 голосов
/ 06 февраля 2019

Расширение Ану Вишван ответ , начиная с 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;
    }
}
0 голосов
/ 05 февраля 2019

В подобных случаях я использую словари, соединенные со значениями лямбда-выражений, подходящими для конкретной задачи.

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);
...