Параметры функции перечисления c # - PullRequest
8 голосов
/ 03 февраля 2009

Как следует из этого вопроса.

Как я могу вызвать функцию и передать Enum?

Например, у меня есть следующий код:

enum e1
{
    //...
}

public void test()
{
    myFunc( e1 );
}

public void myFunc( Enum e )
{
    var names = Enum.GetNames(e.GetType());

    foreach (var name in names)
    {
        // do something!
    }

}

Хотя, когда я делаю это, я получаю 'e1' типа ', но используется как' переменная 'Сообщение об ошибке Любые идеи, чтобы помочь?

Я пытаюсь сохранить универсальную функцию для работы с любым Enum, а не только с конкретным типом? Это вообще возможно? ... Как насчет использования универсальной функции? это будет работать?

Ответы [ 4 ]

9 голосов
/ 03 февраля 2009

Вы можете использовать универсальную функцию:

    public void myFunc<T>()
    {
        var names = Enum.GetNames(typeof(T));

        foreach (var name in names)
        {
            // do something!
        }
    }

и звоните как:

    myFunc<e1>();

(EDIT)

Компилятор жалуется, если вы пытаетесь ограничить T до Enum или enum.

Итак, чтобы обеспечить безопасность типов, вы можете изменить свою функцию на:

    public static void myFunc<T>()
    {
        Type t = typeof(T);
        if (!t.IsEnum)
            throw new InvalidOperationException("Type is not Enum");

        var names = Enum.GetNames(t);
        foreach (var name in names)
        {
            // do something!
        }
    }
9 голосов
/ 03 февраля 2009

Почему бы не передать тип? как:

 myfunc(typeof(e1));

public void myFunc( Type t )
{
}
5 голосов
/ 03 февраля 2009

Вы пытаетесь передать тип enum как экземпляр этого типа - попробуйте что-то вроде этого:

enum e1
{
    foo, bar
}

public void test()
{
    myFunc(e1.foo); // this needs to be e1.foo or e1.bar - not e1 itself
}

public void myFunc(Enum e)
{
    foreach (string item in Enum.GetNames(e.GetType()))
    {
        // Print values
    }
}
0 голосов
/ 03 февраля 2009

Используйте

public void myFunc( e1 e ) { // use enum of type e}

вместо

public void myFunc( Enum e ) { // use type enum. The same as class or interface. This is not generic! }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...