Я только начал изучать пакет CommunityToolkit.Mvvm
(он же MVVM Toolkit) и прочитал вводную документацию, и мне показалось, что он будет работать и для VB.NET:
Знакомство с набором инструментов MVVM — наборы инструментов сообщества для .NET
Но я написал тестовый проект VB.NET (я установил NuGet-пакет CommunityToolkit.Mvvm в последней стабильной версии 8.2.2), и похоже, что он не генерирует наблюдаемый код автоматически:
Imports CommunityToolkit.Mvvm.ComponentModel
Partial Public Class MyViewModel : Inherits ObservableObject
<ObservableProperty>
Private id As Integer
<ObservableProperty>
<NotifyPropertyChangedFor(NameOf(FullName))>
Private firstName As String
<ObservableProperty>
<NotifyPropertyChangedFor(NameOf(FullName))>
Private lastName As String
Public ReadOnly Property FullName As String
Get
Return $"{firstName} {lastName}"
End Get
End Property
End Class
Итак, я попробовал сделать то же самое в проекте C#, и это сработало:
using CommunityToolkit.Mvvm.ComponentModel;
internal partial class MyViewModel : ObservableObject
{
[ObservableProperty]
private int id;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
private string firstName;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
private string lastName;
public string FullName => $"{firstName} {lastName}";
}
Итак, работает ли автоматическая генерация кода для ObservableObject
и ObservableProperty
для VB.NET или нет?
Я не нашел никакого упоминания о VB.NET в документации, кроме отрывка, который я упомянул в вопросе, но теперь я выполнил поиск в исходном коде пакета CommunityToolkit.Mvvm
(GitHub - CommunityToolkit/dotnet: .NET Community Toolkit), и кажется, что генерация кода действительно работает только для C#:
dotnet/src/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs
namespace CommunityToolkit.Mvvm.SourceGenerators;
[Generator(LanguageNames.CSharp)]
public sealed partial class ObservablePropertyGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
// [ ... ]
if (!context.SemanticModel.Compilation.HasLanguageVersionAtLeastEqualTo(LanguageVersion.CSharp8))
{
return default;
}
// [ ... ]
}
}
Обратите внимание на атрибут, используемый для класса, Generator(LanguageNames.CSharp)
, и на раздел, который проверяет, что языковая версия не ниже C# 8, Compilation.HasLanguageVersionAtLeastEqualTo(LanguageVersion.CSharp8)
.
Я только что это сделал, спасибо @OlivierJacot-Descombes: github.com/CommunityToolkit/dotnet/issues/888
Они ответили на запрос функции следующим сообщением: «Привет! К сожалению, это не запланировано, и мы не собираемся добавлять эту функцию».
Вы можете подать запрос на добавление функции в репозиторий Git. Насколько я знаю, в VB также есть генераторы исходного кода.