/// <summary> /// 添加 struct 约束 /// </summary> /// <param name="paramterName"></param> /// <returns></returns> public GenericBuilder AddStruct(string paramterName) { DefineGenericInfo info = Search(paramterName); info.Name = paramterName; info.Parameter = SyntaxFactory.TypeParameter(SyntaxFactory.Identifier(paramterName)); info.ConstraintClauseSyntax.Add( SyntaxFactory.TypeParameterConstraintClause(SyntaxFactory.IdentifierName(paramterName)).WithConstraints( SyntaxFactory.SingletonSeparatedList <TypeParameterConstraintSyntax>( SyntaxFactory.ClassOrStructConstraint(SyntaxKind.StructConstraint)))); return(this); }
/// <summary> /// 搜索 /// </summary> /// <param name="paramterName"></param> /// <returns></returns> private DefineGenericInfo Search(string paramterName) { DefineGenericInfo info = default; if (!tokens.ContainsKey(paramterName)) { tokens.Add(paramterName, info); } else { info = tokens[paramterName]; } return(info); }
/// <summary> /// 添加 unmanaged 约束 /// </summary> /// <param name="paramterName"></param> /// <returns></returns> public GenericBuilder AddUnmanaged(string paramterName) { DefineGenericInfo info = Search(paramterName); info.Parameter = SyntaxFactory.TypeParameter(SyntaxFactory.Identifier(paramterName)); info.ConstraintClauseSyntax.Add( SyntaxFactory.TypeParameterConstraintClause(SyntaxFactory.IdentifierName(paramterName)) .WithConstraints( SyntaxFactory.SingletonSeparatedList <TypeParameterConstraintSyntax>( SyntaxFactory.TypeConstraint( SyntaxFactory.IdentifierName("unmanaged"))))); return(this); }
/// <summary> /// 添加一个参数 /// </summary> /// <param name="paramterName">参数名称</param> /// <param name="info">信息</param> /// <returns></returns> private GenericBuilder Add(string paramterName, out DefineGenericInfo info) { if (!tokens.ContainsKey(paramterName)) { info = new DefineGenericInfo(); tokens.Add(paramterName, info); } else { info = tokens[paramterName]; } info.Name = paramterName; info.Parameter = SyntaxFactory.TypeParameter(SyntaxFactory.Identifier(paramterName)); return(this); }
/// <summary> /// 添加接口约束 /// </summary> /// <param name="paramterName"></param> /// <param name="interfaces"></param> /// <returns></returns> public GenericBuilder AddInterface(string paramterName, string[] interfaces) { DefineGenericInfo info = Search(paramterName); info.Parameter = SyntaxFactory.TypeParameter(SyntaxFactory.Identifier(paramterName)); SyntaxNodeOrToken[] syntaxes = new SyntaxNodeOrToken[interfaces.Length]; for (int i = 0; i < interfaces.Length; i++) { syntaxes[i] = SyntaxFactory.TypeConstraint( SyntaxFactory.IdentifierName(interfaces[i])); } info.ConstraintClauseSyntax.Add( SyntaxFactory.TypeParameterConstraintClause( SyntaxFactory.IdentifierName(paramterName)) .WithConstraints( SyntaxFactory.SeparatedList <TypeParameterConstraintSyntax>(syntaxes))); return(this); }