C#: Как использовать общий метод с переменной

Посмотрите Herb Sutter Гуру Недели 54 для относительных достоинств вектора и двухсторонней очереди, где любой сделал бы.

я предполагаю, что несоответствие между priority_queue и очередью состоит просто в том, что различные люди реализовали их.

8
задан Tin Vo 14 November 2009 в 21:59
поделиться

3 ответа

Во-первых, это очень плохой образец. Вы не должны использовать такой узор. Может быть, если вы опишете, чего вы действительно хотите достичь, будут лучшие ответы.

Код ниже работает, но, как я уже сказал, писать код таким образом - плохая идея.

    void Assign<T>(out T result) 
    { 
        Type type = typeof(T); 
        if (type.Name == "String") 
        { result = (T) ((object)"hello"); } 
        else if (type.Name == "Int32") 
        { result = (T) ((object)100); } 
        else result = default(T); 
    }

И использование:

        int value;
        string text;

        Assign(out value);
        Assign(out text);
3
ответ дан 5 December 2019 в 08:24
поделиться

Похоже, в данном случае, может быть, вы делаете это, чтобы избежать бокса? Трудно сказать без дополнительной информации, но для этого конкретного примера было бы намного проще и, вероятно, менее подвержено ошибкам просто использовать перегрузку метода:

void Assign(out string value)
{
   //...
}

void Assign(out int value)
{
   //...
}

Для того, чтобы узнать, что здесь неверно, вам нужно преобразовать значение в объект, прежде чем преобразовывать его в общий тип:

(T)(object)"hello world!";

Какой IMO довольно неприятен и должен быть в крайнем случае - определенно не делает ваш код чище.

Каждый раз, когда вы выполняете проверку типов общих параметров, это хороший признак того, что универсальные шаблоны не являются правильным решением вашей проблемы. Проверка типов общих параметров делает ваш код более сложным, а не простым. Он делает один метод ответственным за разное поведение в зависимости от типа, а не серию отдельных методов, которые легко изменить, не затрагивая другие. См. Принцип единой ответственности .

(T)(object)"hello world!";

Какой ИМО довольно неприятен и должен использоваться в крайнем случае - уж точно не делает ваш код чище.

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

(T)(object)"hello world!";

Какой IMO является довольно неприятным и должен применяться в крайнем случае - уж точно не делает ваш код чище.

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

Выполнение общих проверок типов параметров делает ваш код более сложным, а не простым. Это делает один метод ответственным за разное поведение в зависимости от типа, а не серию отдельных методов, которые легко изменить, случайно не затрагивая другие. См. Принцип единой ответственности .

Выполнение общих проверок типов параметров делает ваш код более сложным, а не простым. Он делает один метод ответственным за разное поведение в зависимости от типа, а не серию отдельных методов, которые легко изменить, не затрагивая другие. См. Принцип единой ответственности .

16
ответ дан 5 December 2019 в 08:24
поделиться

Вот один способ:

static void Assign<T>(out T result) { 
    Type type = typeof(T);
    if (type.Name == "String") {
        result = (T)Convert.ChangeType("hello", typeof(T));
    }
    else if (type.Name == "Int32") {
        result = (T)Convert.ChangeType(100, typeof(T));
    }
    else {
        result = default(T);
    }
}

Но этот код очень плохо пахнет и идет вразрез с точки зрения обобщений (вместо этого используйте перегруженные методы). Я надеюсь, что это не закончится где-нибудь в производственном коде, а просто для назидания.

0
ответ дан 5 December 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: