Мы разработали DSL, чтобы помочь в кодировании пользовательских модулей Orchard. В методе редактора сгенерированного драйвера мы используем частичные методы, позволяющие программисту при необходимости переопределить поведение сгенерированного кода.
Однако во время выполнения мы получаем исключение, что разделяемый метод не реализован.
A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll
Additional information: 'MyModule.Drivers.CompanyPartDriver' does not contain a definition for 'CustomEditorGet'
Согласно спецификации С#, это не обязательно, поэтому мне интересно, мешает ли здесь динамическая компиляция (или что-то подобное). Обратите внимание, что код компилируется вручную перед запуском и отладкой, поэтому не должно быть кода, который нужно компилировать во время выполнения.
Рассматриваемый бит выглядит следующим образом:
public partial class CompanyPartDriver : ContentPartDriver<CompanyPart>
{
// other code
partial void CustomEditorGet(CompanyPart part, dynamic shapeHelper, ref DriverResult result);
protected override DriverResult Editor(CompanyPart part, dynamic shapeHelper)
{
DriverResult result;
if (AdminFilter.IsApplied(HttpContext.Current.Request.RequestContext))
result = ContentShape("Parts_CompanyAdmin_Edit",
() => shapeHelper.EditorTemplate(TemplateName: "Parts/CompanyAdmin",
Model: part,
Prefix: Prefix));
else
result = ContentShape("Parts_Company_Edit",
() => shapeHelper.EditorTemplate(TemplateName: "Parts/Company",
Model: part,
Prefix: Prefix));
CustomEditorGet(part, shapeHelper, ref result);
return result;
}
// other code
}
Добавление реализации метода «CustomEditorGet» в разделяемый класс в другом файле, даже если он пустой, все в порядке. Простое добавление частичного класса без частичного метода impl не исправит это.
Какие-нибудь мысли?
partial class
фактически не обеспечивает реализацию методаpartial void
, этот метод считается несуществующим во время компиляции. Так что на самом деле он не переводится в IL, и все вызовы к нему удаляются. Однако это не объясняет проблему, которую вы видите, поэтому я думаю, что мне нужно больше информации. Можете ли вы воспроизвести с помощью полного и автономного примера кода? - person Jeppe Stig Nielsen   schedule 21.08.2014dynamic
в своем вызове. В этом случае привязка откладывается до времени выполнения. Но методpartial void
фактически не будет существовать во время выполнения. - person Jeppe Stig Nielsen   schedule 21.08.2014