Generi c аргументы метода - PullRequest
       0

Generi c аргументы метода

1 голос
/ 26 марта 2020

У меня есть метод, который принимает string[] аргументы

public static void MyMethod(string[] s1, string[] s2, string[] s3, string[] s4)
{

}

Иногда у меня возникает ситуация, когда вместо string[] я хотел бы использовать обычный string

Можно ли задать универсальные c аргументы метода для приема массива или простого текста?

Что мне нужно (примеры):

MyMethod(["a", "b"], ["s", "m"], ["i", "k"], ["a", "e"])
MyMethod(["a", "p"], "u", ["v", "p"], "e")
MyMethod("a", "b", "b", "d")

и другие комбинации

Ответы [ 4 ]

2 голосов
/ 26 марта 2020

Интересно. Что вам нужно, так это, как говорили другие, используя params с косвенным / пользовательским типом, поддерживающим неявное преобразование из string и string[].

Например:

public static void MyMethod(params StringArray[] s)
{   
}

class StringArray
{
    public string[] Value { get; set; }

    public static implicit operator StringArray(string str)
    {
        return new StringArray
        {
            Value = new[] { str }
        };
    }

    public static implicit operator StringArray(string[] str)
    {
        return new StringArray
        {
            Value = str
        };
    }
}

Тогда Вы можете сделать:

MyMethod(new[] { "a", "b" }, new[] { "s", "m" }, new[] { "i", "k" }, new[] { "a", "e" });
MyMethod(new[] { "a", "p" }, "u", new[] { "v", "p" }, "e");
MyMethod("a", "b", "b", "d");
2 голосов
/ 26 марта 2020

Вы можете использовать ключевое слово params:

public static void MyMethod(params string[] s)
{

}

Таким образом, вы можете передать простую строку в качестве параметра вашему методу, например:

MyMethod("str");

Или несколько значений в виде массива:

MyMethod("str1","str2","str3");

В зависимости от желаемого результата в обновленном вопросе может оказаться полезной также следующая реализация:

public static void MyMethod(params string[][] s)
{

}

Это будет работает для всех примеров, которые вы упомянули в разделе Что мне нужно вашего вопроса.

1 голос
/ 26 марта 2020

Это возможно с типом оболочки и неявным оператором. При желании вы можете добавить свойство IsCollection, чтобы проверить, как была инициализирована оболочка.

class Program
{
    static void MyMethod(StringCollection s1, StringCollection s2, StringCollection s3, StringCollection s4)
    {

    }

    static void Main(string[] args)
    {
        MyMethod("a", "b", "c", "d");
        MyMethod(new[] { "a1", "a2" }, "b", "c", "d");
    }
}

class StringCollection
{
    public readonly bool IsCollection;
    public string[] Values;

    public StringCollection(string value)
    {
        Values = new[] { value };
        IsCollection = false;
    }

    public StringCollection(string[] values)
    {
        Values = values;
        IsCollection = true;
    }

    public static implicit operator StringCollection(string value)
    {
        return new StringCollection(value);
    }

    public static implicit operator StringCollection(string[] values)
    {
        return new StringCollection(values);
    }
}
1 голос
/ 26 марта 2020

Вы можете попробовать params с зубчатым массивом для этого

public static void MyMethod(params string[][] s1)
{
}

и немного обновить вызов метода

MyMethod(new[] { "a", "b" }, new[] { "s", "m" });
MyMethod(new[] { "a", "p" }, new[] { "u" }, new[] { "v", "p" }, new[] { "e" });
MyMethod(new[] { "a", "b", "b", "d" });

Пожалуйста, имейте в виду, что в последней строке вы передаете только одномерный массив, и вы должны правильно управлять им внутри метода

Однако, он не выглядит достаточно читабельным, IMO. Лучше иметь несколько перегрузок с разными сигнатурами.

public static void MyMethod(params string[][] s1)
{
}
public static void MyMethod(params string[] s1)
{
}

Тогда последний вызов метода можно использовать как MyMethod("a", "b", "b", "d");, без объявления массива.

К сожалению, вы не можете избежать использования объявление массива с оператором new, типизированное значение new выражение появится в следующей версии C#

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...