[AutoSave]
public partial class GeneratedConfig : NotifiyingJsonSettings, IVersionable
{
[EnforcedVersion("1.0.0.0")]
public Version Version { get; set; } = new Version(1, 0, 0, 0);
public override string FileName { get; set; } = $"{AppContext.BaseDirectory}GeneratedConfig.json";
public virtual string TestString { get; set; }
public virtual bool TestBool { get; set; }
}
, который должен генерировать следующий класс (и мой генератор генерирует следующий класс, и я могу видеть сгенерированный класс в зависимости -> Analyzer -> libname.autosavegenerator ):
Я пытаюсь взять класс, подобный ниже, с атрибутом [AutoSave] : [code][AutoSave] public partial class GeneratedConfig : NotifiyingJsonSettings, IVersionable { [EnforcedVersion("1.0.0.0")] public Version Version { get; set; } = new Version(1, 0, 0, 0); public override string FileName { get; set; } = $"{AppContext.BaseDirectory}GeneratedConfig.json"; public virtual string TestString { get; set; } public virtual bool TestBool { get; set; } } [/code] , который должен генерировать следующий класс (и мой генератор генерирует следующий класс, и я могу видеть сгенерированный класс в зависимости -> Analyzer -> libname.autosavegenerator ): [code]public partial class GeneratedConfig : NotifiyingJsonSettings, IVersionable { private System.Version version = new Version(1, 0, 0, 0);
[EnforcedVersion("1.0.0.0")] public System.Version Version { get => version; set { version = value; OnPropertyChanged(nameof(Version)); Save(); } }
public override string FileName { get => fileName; set { if (fileName != value) { fileName = value; OnPropertyChanged(nameof(FileName)); Save(); } } }
private string _testString;
public string TestString { get => _testString; set { _testString = value; OnPropertyChanged(nameof(TestString)); Save(); } }
private bool _testBool;
public bool TestBool { get => _testBool; set { _testBool = value; OnPropertyChanged(nameof(TestBool)); Save(); } } } < /code> Но когда я составляю свое приложение, я получаю некоторые ошибки - например: < /p>
Тип 'GeneratedConfig' уже содержит определение для «filename»
type 'GeneratedCyg' уже содержит определение для «br /> 'Testbool'
type 'GeneratedConfig' уже содержит определение для 'teststring' < /p> < /blockquote> Я использую этот код генератора: < /p> [Generator] public class AutoSaveGenerator : IIncrementalGenerator { public void Initialize(IncrementalGeneratorInitializationContext context) { var classesWithAttribute = context.SyntaxProvider .CreateSyntaxProvider( predicate: static (s, _) => s is ClassDeclarationSyntax cds && cds.AttributeLists.Count > 0, transform: static (ctx, _) => GetClassWithAttribute(ctx)) .Where(static classWithAttribute => classWithAttribute is not null);
var accessibility = classSymbol.DeclaredAccessibility.ToString().ToLower();
// Collect property information var properties = classDeclaration.Members .OfType () .Select(p => new PropertyInfo { Name = p.Identifier.Text, Type = semanticModel.GetTypeInfo(p.Type).Type?.ToDisplayString() ?? "object", IsVirtual = p.Modifiers.Any(SyntaxKind.VirtualKeyword), IsOverride = p.Modifiers.Any(SyntaxKind.OverrideKeyword), DefaultValue = p.Initializer?.Value.ToString(), Attributes = p.AttributeLists .SelectMany(a => a.Attributes) .Select(a => a.ToString()) .ToList() }) .ToList();
var baseTypes = GetBaseTypes(classSymbol);
// Return class info with properties and base types return new ClassInfo { Accessibility = accessibility, ClassName = classSymbol.Name, Namespace = classSymbol.ContainingNamespace.ToDisplayString(), Properties = properties, BaseTypes = baseTypes }; }
private static List GetBaseTypes(INamedTypeSymbol classSymbol) { var baseTypes = new List(); var currentBase = classSymbol.BaseType;
// Start class declaration with base types if any var baseTypeList = classInfo.BaseTypes; baseTypeList.Remove("Nucs.JsonSettings.JsonSettings"); baseTypeList.Remove("JsonSettings"); var baseTypesString = classInfo.BaseTypes.Count > 0 ? " : " + string.Join(", ", baseTypeList) : string.Empty; sb.AppendLine($"{classInfo.Accessibility} partial class {classInfo.ClassName}{baseTypesString}"); sb.AppendLine("{");
// Generate private field with default value if it exists sb.AppendLine($" private {prop.Type} {fieldName}" + (prop.DefaultValue != null ? $" = {prop.DefaultValue};" : ";"));
// Add attributes if any foreach (var attribute in prop.Attributes) { sb.AppendLine($" [{attribute}]"); }
// Generate property sb.AppendLine($" {(prop.IsOverride ? "public override" : "public")}" + $" {prop.Type} {prop.Name}"); sb.AppendLine(" {"); sb.AppendLine($" get => {fieldName};"); sb.AppendLine(" set"); sb.AppendLine(" {"); sb.AppendLine($" if ({fieldName} != value)"); // Add the condition here sb.AppendLine(" {"); sb.AppendLine($" {fieldName} = value;"); sb.AppendLine($" OnPropertyChanged(nameof({prop.Name}));"); // Ensure OnPropertyChanged() is called sb.AppendLine(" Save();"); // Call Save() only if value changed sb.AppendLine(" }"); sb.AppendLine(" }"); sb.AppendLine(" }"); }
sb.AppendLine("}");
return sb.ToString(); }
private class ClassInfo { public string Accessibility { get; set; } = "public"; public string ClassName { get; set; } public string Namespace { get; set; } public List Properties { get; set; } = new(); public List BaseTypes { get; set; } = new(); }
private class PropertyInfo { public string Name { get; set; } public string Type { get; set; } public bool IsVirtual { get; set; } public bool IsOverride { get; set; } public string? DefaultValue { get; set; } public List Attributes { get; set; } = new(); } } [/code] Как я могу исправить это дубликатное свойство?
Когда я открываю файл Objective-C в Visual Studio Intellisense, поэтому Visual Studio использует простой текстовый поиск всего слова в качестве автоматического полного. Достаточно в этих сценариях.
Когда я открываю файл Objective-C в Visual Studio Intellisense, поэтому Visual Studio использует простой текстовый поиск всего слова в качестве автоматического полного. Достаточно в этих сценариях.
Когда я открываю файл Objective-C в Visual Studio Intellisense, поэтому Visual Studio использует простой текстовый поиск всего слова в качестве автоматического полного. Достаточно в этих сценариях.
Я несколько новенький для C#, но, как программист C/C ++, он был довольно легко и быстро поднять этот язык.
Я просто нажимал (очень) крошечную заглушку, для которой мне интересно, нет ли какого -то лучшего решения. /> Для того, чтобы сделать класс...