设置父-子对象初始化的最大计数



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());

最新更新