Fody.PropertyChanged — не удалось внедрить метод EventInvoker

У меня есть ConfigurationViewModel, которая наследуется от BaseViewModel. BaseViewModel вынесен в отдельный проект и имеет реализованный интерфейс INotifyPropertyChanged. В этом отдельном проекте не установлен Fody.PropertyChanged.

Когда я пытаюсь построить решение, у меня есть исключение:

Failed to execute weaver C:\Users\Rafal\.nuget\packages\propertychanged.fody\2.6.0\build\..\netclassicweaver\PropertyChanged.Fody.dll
Type:
System.Exception
StackTrace:
   at InnerWeaver.ExecuteWeavers() in C:\projects\fody\FodyIsolated\InnerWeaver.cs:line 186
   at InnerWeaver.Execute() in C:\projects\fody\FodyIsolated\InnerWeaver.cs:line 109
Source:
FodyIsolated
TargetSite:
Void ExecuteWeavers()
Could not inject EventInvoker method on type 'Designer.VVM.ConfigurationViewModel'. It is possible you are inheriting from a base class and have not correctly set 'EventInvokerNames' or you are using a explicit PropertyChanged event and the event field is not visible to this instance. Either correct 'EventInvokerNames' or implement your own EventInvoker on this class. If you want to suppress this place a [DoNotNotifyAttribute] on Designer.VVM.ConfigurationViewModel.
Type:
Fody.WeavingException
StackTrace:
   at ModuleWeaver.InjectMethod(TypeDefinition targetType, InvokerTypes& invokerType)
   at ModuleWeaver.AddOnPropertyChangedMethod(TypeDefinition targetType)
   at ModuleWeaver.FindMethodsForNodes()
   at ModuleWeaver.Execute()
   at InnerWeaver.ExecuteWeavers() in C:\projects\fody\FodyIsolated\InnerWeaver.cs:line 182
Source:
PropertyChanged.Fody
TargetSite:
Mono.Cecil.MethodDefinition InjectMethod(Mono.Cecil.TypeDefinition, InvokerTypes ByRef)

Когда я перемещаю BaseViewModel в тот же проект, что и ConfigurationViewModel, все в порядке.

Это стандартное поведение? Это ошибка? Я делаю что-то неправильно? Как использовать Fody.PropertyChanged с BaseViewModel в отдельном проекте?


person raV720    schedule 27.03.2019    source источник


Ответы (1)


когда базовая модель представления находится в том же проекте, в этот класс можно внедрить метод OnPropertyChanged. При ссылке на базовую модель представления из другого проекта этот проект должен иметь «OnPropertyChanged», соответствующий соглашению, или настроить имя метода с помощью EventInvokerNames https://github.com/Fody/PropertyChanged/wiki/EventInvokerSelectionInjection

в общем, попробуйте добавить это в свою базовую модель представления

public virtual void OnPropertyChanged(string propertyName)
{
    var propertyChanged = PropertyChanged;
    if (propertyChanged != null)
    {
        propertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
person Simon    schedule 27.03.2019
comment
Что делать, если у вас нет доступа к исходному коду базового класса? - person Pancake; 10.06.2020
comment
@Pancake, я думаю, вам следует задать новые вопросы и включить структуру вашего базового класса. - person Simon; 10.06.2020
comment
возможно, вы неправильно прочитали мой комментарий, у меня нет видимости базового класса - person Pancake; 11.06.2020
comment
используйте ILSpy, чтобы изучить его - person Simon; 12.06.2020