Подход для использования «params» в определении общего типа

2

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

Один из подходов состоит в том, чтобы принять params Type[] как часть аргументов, например:

public static bool IsOneOf(this object obj, params Type[] types)
{
    return types.Contains(obj.GetType());
}

Однако использование немного подробное (например, obj.IsOneOf(typeof(int), typeof(bool), typeof(double))), и мне интересно об альтернативных подходах к определению одного метода, принимающего произвольное количество общих аргументов. Что-то похожее на:

public static bool IsOneOf<params TArgs[]>(this object obj)
{
    // use TArgs here
}

Одним из решений для этого было бы использовать классы 4.0 BCL Tuple (он определяет общий интерфейс ITuple, а также Tuple<T1>, Tuple<T1, T2> и т.д.), чтобы определить что-то вроде следующего:

public static bool IsOneOf<TTypes>(this object obj) where TTypes : ITuple
{
    Type tupleType = typeof(TTypes);
    return tupleType.GetGenericArguments().Contains(obj.GetType());
}

Затем он может быть использован следующим образом:

if (obj.IsOneOf<Tuple<int, bool, decimal>>()) { ... }

Есть ли соображения производительности здесь или есть альтернативные методы для достижения этого синтаксиса?

  • 0
    Разве в .net Framework что-то уже есть, чтобы проверить наличие элемента в списке? Какова цель того, что вы делаете это, кроме расширения объекта?
  • 0
    Да, есть список. Содержит. Проблема в том, что вы не можете иметь params в определении общего аргумента для метода. Первоначальная цель - расширение объекта, но оно может быть применимо в других местах.
Теги:
generics
extension-methods

1 ответ

1

Вы могли бы выжать немного дополнительной скорости, развернув цикл в особых случаях для каждой "arity":

static bool IsOneOf<T1>(object o)
{
    return (o.GetType() == typeof (T1));
}

static bool IsOneOf<T1, T2>(object o)
{
    return (o.GetType() == typeof(T1)) ||
           (o.GetType() == typeof(T2));
}

static bool IsOneOf<T1, T2, T3>(object o)
{
    return (o.GetType() == typeof(T1)) ||
           (o.GetType() == typeof(T2)) ||
           (o.GetType() == typeof(T3));
}

И так далее.

Но тогда, как часто вам нужно знать, является ли объект той или иной из пары несвязанных типов? Не говоря уже о трех или более. Кажется, мне очень неясно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню