public void 方法_T6_泛型参数() { MethodBuilder builder = CodeSyntax.CreateMethod("Test") .WithAccess(MemberAccess.Public) .WithReturnType("T1") .WithGeneric(builder => { builder.WithTransformParam("T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11") .WithTransformConstraint(@" where T1 : struct where T2 : class where T3 : notnull where T4 : unmanaged where T5 : new() where T6 : IEnumerable<Dictionary<int, int>> where T7 : IEnumerable<int> where T8 : T2"); }) .WithParams("T1 t1, T2 t2, T3 t3") .WithBlock("return t1;"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result); #endif Assert.Equal(@"public T1 Test<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(T1 t1, T2 t2, T3 t3) where T1 : struct where T2 : class where T3 : notnull where T4 : unmanaged where T5 : new() where T6 : IEnumerable<Dictionary<int, int>> where T7 : IEnumerable<int> where T8 : T2 { return t1; }", result); }
public void 定义字段_T1_简单型() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithType("int"); var result = builder.ToFormatCode(); }
public void 设置名字() { const string constCode = @"namespace MySpace { }"; string name = "MySpace"; var builder = CodeSyntax.CreateNamespace(name); var code = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(code); #endif Assert.Equal(constCode, code.WithUnixEOL()); builder = CodeSyntax.CreateNamespace(name); code = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(code); #endif Assert.Equal(constCode, code.WithUnixEOL()); }
public void 添加命名空间() { const string constCode = @" using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Security.Cryptography; using System.Threading; namespace MySpace { }"; var builder = CodeSyntax.CreateNamespace("MySpace"); builder .WithUsing("System") .WithUsing( "System.Collections.Generic", "System.ComponentModel", "System.Linq", "System.Security.Cryptography", "System.Threading"); var code = builder.ToFullCode(); #if Log _tempOutput.WriteLine(code); #endif Assert.Equal(constCode, code); }
/// <summary> /// 字符串生成特性 /// </summary> /// <param name="attrCode"></param> /// <returns></returns> /// <example> /// <code> /// "[Display(Name = \"a\")]" /// </code> /// </example> public static AttributeListSyntax CreateAttributeList(string attrCode) { var result = CodeSyntax.CreateAttribute(attrCode); return(SyntaxFactory.AttributeList( SyntaxFactory.SingletonSeparatedList <AttributeSyntax>(result.BuildSyntax()))); }
public void 属性_T2() { PropertyBuilder builder = CodeSyntax.CreateProperty("i"); var field = builder .WithAccess(MemberAccess.ProtectedInternal) .WithKeyword(PropertyKeyword.Static) .WithType("int") .WithName("i") .WithGetSet("get{return tmp+1;}", "set{tmp+=1;}") .WithInit("int.Parse(\"1\")"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal(@"protected internal static int i { get { return tmp + 1; } set { tmp += 1; } } = int.Parse(""1"");", result.WithUnixEOL()); }
/// <summary> /// 读取if(){}else if(){}else{}语句。 /// </summary> private void ReadIf(CodeReader reader, Syntax syntax) { var current = new IfSyntax(); current.Name = "@if"; current.Parameters = reader.ReadParameters(); ParseChildren(reader, current); //读取elseif语句 while (reader.IsNextNonWhiteSpace("elseif", stringComparison: StringComparison.OrdinalIgnoreCase)) { var elseif = new IfSyntax(); elseif.Name = "elseif"; elseif.Parameters = reader.ReadParameters(); ParseChildren(reader, elseif); if (current.ElseIf == null) { current.ElseIf = new List <IfSyntax>(); } current.ElseIf.Add(elseif); } //读取elseif语句 if (reader.IsNextNonWhiteSpace("else", stringComparison: StringComparison.OrdinalIgnoreCase)) { var @else = new CodeSyntax(); @else.Name = "else"; ParseChildren(reader, @else); current.Else = @else; } syntax.Append(current); }
public void 定义字段_T3_表达式初始化值() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithType("int") .WithInit("int.Parse(\"1\")"); var result = builder.ToFormatCode(); }
public void 定义字段_T2_常量初始化值() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithType("int") .WithInit("0"); var result = builder.ToFormatCode(); }
public void 定义字段_T8_特性注解() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithAttributes(new string[] { @"[Display(Name = ""a"")]", @"[Key]" }) .WithAccess(MemberAccess.Public) .WithType("int"); var result = builder.ToFormatCode(); }
public void 定义字段_T6_超长的泛型() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithType("List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>") .WithName("i") .WithInit("new List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>()"); var result = builder.ToFormatCode(); }
public void 定义字段_T5_修饰符() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithAccess(MemberAccess.ProtectedInternal) .WithKeyword(FieldKeyword.Static) .WithType("int"); var result = builder.ToFormatCode(); }
public void 定义字段_T4_访问修饰符() { var field1 = CodeSyntax.CreateField("i") .WithAccess(MemberAccess.Public) .WithType("int") .WithName("i"); var result = field1.ToFormatCode(); }
public string[] Start() { // 编译选项 // 编译选项可以不配置 DomainOptionBuilder option = new DomainOptionBuilder() .WithPlatform(Platform.AnyCpu) // 生成可移植程序集 .WithDebug(false) // 使用 Release 编译 .WithKind(OutputKind.DynamicallyLinkedLibrary) // 生成动态库 .WithLanguageVersion(LanguageVersion.CSharp7_3); // 使用 C# 7.3 string dllName = "N" + Guid.NewGuid().ToString() + ".dll"; CompilationBuilder builder = CodeSyntax.CreateCompilation(dllName) .WithPath(Directory.GetParent(typeof(Program).Assembly.Location).FullName) .WithOption(option) // 可以省略 .WithAutoAssembly() // 自动添加程序集引用 .WithNamespace(NamespaceBuilder.FromCode(Code)); try { if (builder.CreateDomain(out var messages)) { Messages.Add("编译成功!开始执行程序集进行验证!"); var assembly = Assembly.LoadFile(Directory.GetParent(typeof(Program).Assembly.Location).FullName + "/" + dllName); var type = assembly.GetType("MySpace.Test"); var method = type.GetMethod("MyMethod"); object obj = Activator.CreateInstance(type); string result = (string)method.Invoke(obj, null); if (result.Equals("测试成功")) { Messages.Add("执行程序集测试成功!"); } else { Messages.Add("执行程序集测试失败!"); } } else { _ = messages.Execute(item => { Messages.Add(@$ "ID:{item.Id} 严重程度:{item.Severity} 位置:{item.Location.SourceSpan.Start}~{item.Location.SourceSpan.End} 消息:{item.Descriptor.Title} {item}"); }); } } catch (Exception ex) { Console.WriteLine($"{ex.ToString()}"); } return(Messages.ToArray()); }
public void 特性_T1() { AttributeBuilder builder = CodeSyntax.CreateAttribute("Key"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal("Key", result.WithUnixEOL()); }
public void 定义属性_T1_简单型() { PropertyBuilder builder = CodeSyntax.CreateProperty("i") .WithType("int"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal(@"int i { get; set; }", result.WithUnixEOL()); }
public void 特性_T2() { AttributeBuilder builder = CodeSyntax.CreateAttribute("DisplayName") .WithCtor("666"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal("DisplayName(666)", result.WithUnixEOL()); }
public void 定义字段_T1_简单型() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithType("int"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal("int i;", result.WithUnixEOL()); }
public void 特性_T3() { AttributeBuilder builder = CodeSyntax.CreateAttribute("DisplayName") .WithProperty(new string[] { "Name = \"a\"" }); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal(@"DisplayName(Name = ""a"")", result.WithUnixEOL()); }
public void 委托_T2_返回值() { DelegateBuilder builder = CodeSyntax.CreateDelegate("T2") .WithAccess(MemberAccess.Public) .WithReturnType("string"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result); #endif Assert.Equal("public delegate string T2();", result); }
public void 委托_T1_类中() { DelegateBuilder builder = CodeSyntax.CreateDelegate("T1") .WithAccess(NamespaceAccess.Public) .WithReturnType("void"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result); #endif Assert.Equal("public delegate void T1();", result); }
public void 定义字段_T3_表达式初始化值() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithType("int") .WithInit("int.Parse(\"1\")"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal("int i = int.Parse(\"1\");", result.WithUnixEOL()); }
public void 定义字段_T2_常量初始化值() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithType("int") .WithInit("0"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result); #endif Assert.Equal("int i = 0;", result); }
public void 事件_T1() { EventBuilder builder = CodeSyntax.CreateEvent("t1") .WithAccess(MemberAccess.Public) .WithType("T") .WithInit("AAA"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result); #endif Assert.Equal("public event T t1 = AAA;", result); }
public void 定义属性_T3_表达式初始化值() { PropertyBuilder builder = CodeSyntax.CreateProperty("i") .WithType("int") .WithInit("int.Parse(\"1\")"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal(@"int i { get; set; } = int.Parse(""1"");", result.WithUnixEOL()); }
public void 定义属性_T4_访问修饰符() { var field1 = CodeSyntax.CreateProperty("i") .WithAccess(MemberAccess.Public) .WithType("int") .WithName("i"); var result = field1.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal(@"public int i { get; set; }", result.WithUnixEOL()); }
public void 定义字段_T4_访问修饰符() { var field1 = CodeSyntax.CreateField("i") .WithAccess(MemberAccess.Public) .WithType("int") .WithName("i"); var result = field1.ToFormatCode(); #if Log _tempOutput.WriteLine(result); #endif Assert.Equal("public int i;", result); }
public void 定义字段_T5_修饰符() { FieldBuilder builder = CodeSyntax.CreateField("i") .WithAccess(MemberAccess.ProtectedInternal) .WithKeyword(FieldKeyword.Static) .WithType("int"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal("protected internal static int i;", result.WithUnixEOL()); }
public void 定义属性_T6_超长的泛型() { PropertyBuilder builder = CodeSyntax.CreateProperty("i") .WithType("List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>") .WithName("i") .WithInit("new List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>()"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal(@"List<Dictionary<int, Dictionary<string, List<FieldInfo>>>> i { get; set; } = new List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>();", result.WithUnixEOL()); }
public void 定义属性_T5_修饰符() { PropertyBuilder builder = CodeSyntax.CreateProperty("i") .WithAccess(MemberAccess.ProtectedInternal) .WithKeyword(PropertyKeyword.Static) .WithType("int"); var result = builder.ToFormatCode(); #if Log _tempOutput.WriteLine(result.WithUnixEOL()); #endif Assert.Equal(@"protected internal static int i { get; set; }", result.WithUnixEOL()); }