2010-12-16 2 views
1

У меня есть большая коллекция объектов разных встроенных типов, например. int, bool [], double [] и т. д.C# - как применять различные общие методы для T и T []

На объекте M Я хотел выполнить операцию MyMethod один раз с каждым элементом коллекции. Тем не менее, мне нужно было выполнить различные операции с массивами и разные с одиночными значениями.

Во-первых, я попробовал:

public void MyMethod<T>(T value) 

public void MyMethod<T>(T[] array) 

, но затем, первый метод был применен с каждым элементом коллекции, в том числе массивов.

Моя следующая попытка была:

public void MyMethod<T>(T value) where T : struct 

public void MyMethod<T>(T[] array) 

И это был следующий эффект, когда я попытался вызвать этот метод:

Error 8 The type 'T' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'MyMethod(T)'

Похоже, что компилятор не видит MyMethod (T [] массив) способ. Где я ошибаюсь?

Наконец, я представил вспомогательный метод:

public void MyAux<T>(T value) { 
    if (value.GetType().IsArray) { 
     this.MyMethodForArray(value); 
    } 
    else { 
     this.MyMethodForSingleValue(value); 
    } 

, но потом я получил ошибку:

Error 8 The type arguments for method 'MyMethodForArray(T[])' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Как справиться с этой проблемой элегантно?

+0

Я просто попытался тиражирование то же самое, но функции вызывается правильно (т.е. массив Обобщенные методы массивов, передаваемых и обычной версии для аргументов, не являющихся массивами.) – Chandu 2010-12-16 14:56:31

+0

Ваш первый подход должен работать нормально – 2010-12-16 14:59:25

ответ

3

имеет только одну версии функции (версия массива), но объявить его с params ключевым словом, например так:

public void MyMethod<T>(params T[] array) 

Что-то еще вы можете исследовать это с помощью IEnumerable<T>, а не T[]

4

Создания простая программа, приведенная ниже

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo t = new Foo(); 
     // Line numbering for convenience 
     t.MyMethod<bool>(true);      // #1 
     t.MyMethod<bool>(new bool[] { true });  // #2 
     t.MyMethod<bool[]>(new bool[] { true }); // #3 
    } 
} 

public class Foo 
{ 
    public void MyMethod<T>(T value) 
    { 
     Console.WriteLine("Single element method called"); 
    } 

    public void MyMethod<T>(T[] array) 
    { 
     Console.WriteLine("Array method called"); 
    } 
} 

Выход будет:

Single element method called 
Array method called 
Single element method called 

Я подозреваю, что вы вызвали метод, как в строке №3, где вы планировали называть его, как в строке # 2. Обратите внимание, что разница в двух дополнительных квадратных скобках.

5

Если у вас болит, когда вы это делаете, не делайте этого. Вы заметите, что типы данных List в структуре имеют метод Add и AddRange. Метод, который принимает элемент и метод, который принимает коллекцию элементов, логически отличается настолько, что имеет смысл дать им разные имена. Вместо того, чтобы ударить головой о систему типов, просто измените имя одного из них.

Смежные вопросы