Я пытаюсь изучить и использовать генератор исходного кода на 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
Как использовать генератор исходного кода в C#? ⇐ C#
Место общения программистов C#
-
Anonymous
1736209019
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79334641/how-to-use-source-generator-in-c[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия