Ограничения на параметры - PullRequest
0 голосов
/ 16 марта 2012

У меня есть метод, который регистрирует данные и получает кучу входных данных, используя ключевое слово params

public static void LogData<T>(params object[] parameter)
{
    // log out the data
}

Я хотел бы ограничить ввод строковыми и числовыми типами, и моей первой мыслью было использование предложения where. Очевидная проблема заключается в том, что вы не можете использовать конкретные типы в предложении where, но вы можете обойти это, заметив, что строковые и числовые типы являются IComparable и IConvertible. Я подумал, что это может помочь:

public static void LogData<T>(params T[] parameter)
    where T : IComparable, IConvertible
{
    // log out the data
}

Это не работает, потому что тогда все входы должны быть одного типа.

Есть ли способ ограничить ввод строковыми и числовыми типами с помощью ключевого слова params или другого синтаксиса?

Ответы [ 4 ]

1 голос
/ 16 марта 2012

Я не уверен, почему вы хотите это сделать, когда у каждого объекта есть метод ToString.

В любом случае, вы можете объявить новый класс - NumberOrString, который будет поддерживать неявные преобразования из строки ичисловые типы, которые вы хотите поддерживать.Затем пусть ваш метод LogData принимает params NumberOrString[] p

0 голосов
/ 16 марта 2012

Вот одно из возможных решений:

public static void LogData(params IConvertible[] parameter)
{
    // log out the data
}

Хотя мне интересно, есть ли на самом деле какая-то причина, по которой вам нужно, чтобы объекты были IComparable или IConvertible, или вы просто хотите ограничить их известными типами (то есть строками или числами). Я думаю, что ответ Zmbq может быть путь. Или вы можете просто захотеть посмотреть, реализует ли объект полезный метод ToString. Вот способ , чтобы выяснить это (не ограничение времени компиляции, как вы могли бы ожидать, но во время выполнения с использованием отражения).

0 голосов
/ 16 марта 2012

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

0 голосов
/ 16 марта 2012

Если вы говорите о типах strings и numeric, это невозможно.Если условие будет или , вы можете определить optional parameter типа List<T>, где T - любой выбранный числовой тип.

...