TL;
嗨,我正在创建一个源生成器,这是一个痛苦,因为我开始了TBH。
我有一个类:
public class CsharpTypeBase
{
public CsharpTypeBase(int childCount = 0)
{
childCount++;
if (childCount < 5)
{
Child = new(childCount);
}
}
public bool IsSimple { get; set; }
public bool IsArray { get; set; }
public bool IsIEnumerable { get; set; }
public ref CsharpTypeBase? Child
{
get => ref _child;
}
public string? ValueIfIsSimple
{
get => _valueIfIsSimple;
set
{
IsSimple = true;
_valueIfIsSimple = value;
}
}
public CsharpClassModel ClassModel
{
get => _classModel;
set
{
IsSimple = false;
_classModel = value;
}
}
private string? _valueIfIsSimple;
private CsharpClassModel _classModel = new();
private CsharpTypeBase? _child;
}
这是一个基类的其他CSharp类型,我有(例如:ReturnTypes,Parameters,Properties)
用下面的代码,我试图将c#类解析成更简单的版本(然后对它们做一些事情):
public static CsharpTypeBase Convert(TypeSyntax typeSyntax)
{
var output = new CsharpTypeBase();
FromTypeSyntax(typeSyntax,ref output);
return output;
}
private static void FromTypeSyntax(TypeSyntax typeSyntax,ref CsharpTypeBase output)
{
switch (typeSyntax)
{
case PredefinedTypeSyntax predefinedTypeSyntax:
output.ValueIfIsSimple = predefinedTypeSyntax.Keyword.ValueText;
output.IsIEnumerable = false;
output.IsArray = false;
break;
case IdentifierNameSyntax identifierNameSyntax:
CsharpClassModel.RecursivelyWalkThroughTheClass(identifierNameSyntax.Identifier.ValueText,output);
break;
case ArrayTypeSyntax arrayTypeSyntax:
output.IsArray = true;
output.IsIEnumerable = false;
FromTypeSyntax(arrayTypeSyntax.ElementType,ref output.Child!);
break;
case GenericNameSyntax genericNameSyntax:
var (innerClass,isEnumerable) = FindTheMostInnerType(genericNameSyntax);
output.IsIEnumerable = isEnumerable;
FromTypeSyntax(innerClass,ref output.Child!);
break;
}
}
你可以看到它是一个递归函数,它做得很好,唯一的问题是我有这个设计是(子属性),它不是真正的内存友好和稳定,因为我的基类,默认情况下,它创建5个子类(这是相同的类型我的基,这是愚蠢的,但我不能做任何事情)。
我希望这更有效,如果我只需要2个孩子呢?或者更糟的是,如果我需要创造更多的孩子呢?我需要精确的计数,否则它会溢出(通过创建无限的对象)或爆炸:
FromTypeSyntax(arrayTypeSyntax.ElementType,ref output.Child!);
这段代码应该以某种方式设置一个最大计数
Child = new();
我需要Child属性的原因是解析/转换这种传入类型
List<string>[] one,
List<string[]> two,
Task<List<IReadOnlyCollection<FirstDto>>> three,
AnotherDto[] four,
string five,
int[] six,
List<List<List<List<List<List<string>>>>>> seven
感谢您阅读这个问题。
我通过使Child
对象可为空来解决我的问题:
public CsharpTypeBase? Child { get;set; }
并像这样使用:
FromTypeSyntax(child, output.Child ??= new());