Если вы недавно установили или обновили пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform
, дважды проверьте, что версии этого пакета, на которые ссылается ваш проект, указывают на правильную и ту же версию этого пакета:
ProjectName.csproj
убедитесь, что присутствует тэг <Import>
для Microsoft.CodeDom.Providers.DotNetCompilerPlatform
и указывает на правильную версию. ProjectName.csproj
убедитесь, что тег <Reference>
для Microsoft.CodeDom.Providers.DotNetCompilerPlatform
присутствует и указывает на правильную версию, как в атрибуте Include
, так и на потомке <HintPath>
. web.config
проекта убедитесь, что присутствует тэг <system.codedom>
, и что его дочерние <compiler>
теги имеют одну и ту же версию в свой атрибут type
. По какой-то причине в моем случае обновление этого пакета с 1.0.5 до 1.0.8 вызвало <Reference>
в .csproj
, чтобы его Include
указывал на старую версию 1.0.5.0 (которую я удалил после обновления пакета), но все остальное указывало на новую и правильную версию 1.0.8.0.
Не просматривавший код rocket/gwittir (который необходимо сделать, если Вы хотите узнать, как они сделали это, это - открытый исходный код, в конце концов), я могу только предположить, что они используют задержанную привязку таким способом, которым в течение времени компиляции, они разрабатывают все вызовы к отражению и статически генерируют весь код, требуемый реализовать, они звонят. Таким образом во время времени выполнения, Вы наклоняетесь, делают различные.
Что точно является вопросом - я предполагаю, что Вы хотите передать параметры в дополнение к литералу класса к генератору.
, Поскольку Вы, вероятно, уже знаете, что литерал класса передал GWT.create (), главным образом селектор так, чтобы GWT мог выбрать и выполнить генератор, который в конце выкладывает класс. easist способ передать параметр генератору состоит в том, чтобы использовать аннотации в интерфейсе и передать interface.class GWT.create (). Обратите внимание, конечно, что интерфейс/класс должен расшириться, литерал класса передал в GWT.create ().
class Selector{
}
@Annotation("string parameter...")
class WithParameter extends Selector{}
Selector instance = GWT.create( WithParameter.class )
То, что вы пытаетесь сделать, невозможно в GWT.
Хотя GWT хорошо эмулирует Java во время компиляции, среда выполнения, конечно, совершенно другая. Большинство отражений не поддерживается, и невозможно сгенерировать или динамически загрузить классы во время выполнения.
Я бегло просмотрел код Gwittir, и я думаю, что они делают свои «рефлексии» во время компиляции. Здесь: http://code.google.com/p/gwittir/source/browse/trunk/gwittir-core/src/main/java/com/totsp/gwittir/rebind/beans/IntrospectorGenerator.java
Все возможно .. хотя может быть сложно или даже бесполезно. Как упоминал Ян, для этого вам следует использовать генератор. По сути, вы можете создать свой интерфейс с помощью кода генератора, который берет этот интерфейс и компилирует во время создания и возвращает вам экземпляр. Примером может быть:
//A marker interface
public interface Instantiable {
}
//What you will put in GWT.create
public interface ReflectionService {
public Instantiable newInstance(String className);
}
//gwt.xml, basically when GWT.create finds reflectionservice, use reflection generator
<generate-with class="...ReflectionGenerator" >
<when-type-assignable class="...ReflectionService" />
</generate-with>
//In not a client package
public class ReflectionGenerator extends Generator{
...
}
//A class you may instantiate
public class foo implements Instantiable{
}
//And in this way
ReflectionService service = GWT.create(ReflectionService.class);
service.newInstance("foo");
Все, что вам нужно знать, это как сделать генератор. Я могу сказать вам, что в конце вы делаете в генераторе код Java следующим образом:
if ("clase1".equals(className)) return new clase1();
else if ("clase2".equals(className)) return new clase2();
...
В конце я подумал, что обычно я могу сделать это вручную в своего рода InstanceFactory ... С уважением
Это возможно, хотя и сложно. Вот кровавые подробности:
Если вы думаете, что GWT только как прямая Java для JS, это не сработает. Однако, если вы рассматриваете генераторы - специальные классы с вашим компилятором GWT, компилирует и выполняет во время компиляции, это возможно. Таким образом, вы можете генерировать исходный код java даже при компиляции.
У меня была такая потребность сегодня - наша система имеет дело с динамическими ресурсами вне службы, заканчивающимися строкой и потребностью в классе. Вот решение, которое я придумал - кстати, оно работает под хостингом, IE и Firefox.
Некоторые примечания:
Я надеюсь опубликовать исходный код в ближайшее время. Скрестите пальцы. :)
Я смог сделать то, что, как я думаю, вы пытаетесь сделать, а именно загрузить класс и привязать его к событию динамически; я использовал Generator для динамической привязки класса к событию. Я не рекомендую это делать, но вот пример, если это поможет:
http://francisshanahan.com/index.php/2010/a-simple-gwt-generator-example/