Инструмент для рефакторинга var C# к явному типу

Проблема в том, что с MyTask в качестве EJB-компонента, реализующего Callable , вы удалили сам класс MyTask из «типа бина» этого бина Это означает, что он не может быть введен в «112» «клиента», согласно правилам в спецификации CDI 2.0 :

18.2.2. Типы компонентов сессионного компонента

Неограниченный набор типов компонентов для сессионного компонента содержит все локальные интерфейсы компонента и их суперинтерфейсы. Если сессионный компонент имеет представление без интерфейса, неограниченный набор типов компонентов содержит класс компонента и все суперклассы. Кроме того, java.lang.Object является типом компонента каждого сессионного компонента.

blockquote>

Вот почему Weld не находит действительный bean-компонент MyTask , чтобы удовлетворить внедрение в ваш клиент TestBean .

Вы можете дать MyTask EJB представление без интерфейса, добавив аннотацию @LocalBean, например:

@Stateless
@LocalBean
public class MyTask implements Callable {

Или вы можете удалить implements Callable и рефакторинг например:

public class MyTask {

    @Inject
    MyBean myBean;

    MyCallable callable = new MyCallable();

    public Callable getCallable() {
        return callable;
    }

    private class MyCallable implements Callable {
        @Override
        public String call() throws Exception {

            System.out.println("MyTask called");
            myBean.print();
            return "Task called";
        }
    }
}    

public class TestBean {

    // ...

    MyTask task = myTaskInstance.get(); 
    tasks.add(task.getCallable())

    // ...
}

См. здесь для быстрого ознакомления с представлением без интерфейса, а также этот пост для дальнейшего обсуждения.

18
задан Ian G 14 November 2008 в 10:44
поделиться

5 ответов

У меня есть ReSharper 4.1, и он действительно предлагает эту опцию (в любом направлении).

На самом деле, я рекомендовал бы бросить вызов стандарту... первый намного более читаем, чем последний (особенно, если Вы называете переменную pair или что-то подобное). Я would't используют "var" для var i = 0, но он идеально подходит для вышеупомянутого.

Для объемного изменения, перейдите в:

  • Код Очистки... (выбирают профиль =>, "Изменяет Профили" => Инструменты => Очистка Кода)
    • C# <ул.> <литий> Использование 'var' в объявлении <ул.> <литий>, направление Замены = Может, 'var' для ввода использования <литий> 'foreach' стиль объявления итератора = Всегда использует явный тип <литий>, стиль Локального объявления переменных = Всегда использует явный тип

и работает...

19
ответ дан 30 November 2019 в 06:43
поделиться

Resharper делает это (только в версии 4 +, я уверен в нем), но я не знаю, необходимо ли его возможное для простого преобразования var в автоматический определенный тип - в конечном счете перейти к "var" и затем световые шоу, который дает Вам опцию указать тип явно

4
ответ дан 30 November 2019 в 06:43
поделиться

@Adam - Вы не можете объявить класс здесь, так как это не будет тем, что возвращается из IDictionary<,>.GetEnumerator() - однако, можно исказить через using:

using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime,
    System.Collections.Generic.Dictionary<string, float>>;

Затем:

foreach(InnerPair pair in dict) {...}

Это - просто псевдоним типа, поэтому хорошо работает.

3
ответ дан 30 November 2019 в 06:43
поделиться

DevExpress поддерживает это с CodeRush и ими недавно запускающийся выдающий некоторые рефакторинги бесплатно. Рефакторинг Вас ищет, "Делают Явными"

http://devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/

3
ответ дан 30 November 2019 в 06:43
поделиться

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

class DomainValueCollection : KeyValue<DateTime, Dictionary<string, float>>{}

, где DomainValueCollection - что-то, что имеет смысл в Вашем доменном контексте

, код затем становится

var allItems = new DomainValueCollection();

, а не

var allItems = new KeyValue<DateTime, Dictionary<string, float>>();
0
ответ дан 30 November 2019 в 06:43
поделиться
Другие вопросы по тегам:

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