Как использовать генератор исходного кода в C#?C#

Место общения программистов C#
Ответить
Anonymous
 Как использовать генератор исходного кода в C#?

Сообщение Anonymous »

Я пытаюсь изучить и использовать генератор исходного кода на C#.
Но у меня мало проблем.
Я хочу сделать использование некоторых новых функций C#, таких как общий атрибут, и использование его для создания пользовательского кода.

Итак, у меня есть, например, этот атрибут:
namespace StrongValues;

[AttributeUsage(AttributeTargets.Struct, Inherited = true, AllowMultiple = false)]
public class StrongValueAttribute : StrongValueBaseAttribute
where TValue : IEquatable, IComparable
;

[AttributeUsage(AttributeTargets.Struct, Inherited = true, AllowMultiple = false)]
public abstract class StrongValueBaseAttribute : Attribute
{
public ConvertOperator ValueToStrongOperator { get; set; } = ConvertOperator.Implicit;
public ConvertOperator StrongToValueOperator { get; set; } = ConvertOperator.Explicit;

public bool UseJsonConverter { get; set; } = true;
public bool UseTypeConverter { get; set; } = true;
}

public enum ConvertOperator
{
_ = 0,
None = _,
Implicit,
Explicit
}



Теперь я хочу, чтобы при использовании атрибута было следующее: ...
namespace NS

[StrongValue]
public partial struct Email;

... заключается в создании следующего:
// Generated

namespace NS;

partial struct Email
{
public string Value { get; init; }
}


Код, который я пытаюсь создать, представляет собой урезанную версию StronglyTypedId,
но я не знаю, как его обнаружить атрибут правильно.
Поэтому я сначала пытаюсь определить типы структур:
var structsToGenerate = context.SyntaxProvider
.ForAttributeWithMetadataName(
Parser.StrongValueAttributeDisplayName,
predicate: (node, _) => node is StructDeclarationSyntax,
transform: Parser.GetStructSemanticTarget)
.Where(static m => m is not null)
;

// Not sure what should be the name here since it's generic.
public const string StrongValueAttributeDisplayName = "StrongValues.StrongValueAttribute`1";


Так правильно ли это определить атрибут? И как мне получить общий тип?
string tValue = null!;

foreach (AttributeData attribute in structSymbol.GetAttributes())
{
if (!(
(attribute.AttributeClass?.Name == "StrongValueAttribute"
|| attribute.AttributeClass?.Name == "StrongValueAttribute`1"
|| attribute.AttributeClass?.Name == "StrongValue"
|| attribute.AttributeClass?.Name == "StrongValue`1")
&& attribute.AttributeClass.ToDisplayString() == StrongValueAttributeDisplayName))
{
// wrong attribute
continue;
}

(var hasMisconfiguredInput, attrProps) = GetConstructorValues(attribute);

if (hasMisconfiguredInput) return null;

tValue = attribute.AttributeClass!.TypeArguments.First().ToDisplayString();

if (tValue is null) return null;
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... rator-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»