Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.23 KB | None | 0 0
  1. namespace Marten.Samples.GeneratedType
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. var store = DocumentStore.For(c =>
  8. {
  9. c.Connection("cstring");
  10. c.AutoCreateSchemaObjects = AutoCreate.All;
  11. });
  12.  
  13. var assembly = AssemblyGenerator.Generate();
  14.  
  15. var parcelType = assembly.GetType($"{nameof(GeneratedType)}.Parcel");
  16. var parcelWeight = parcelType.GetProperty("Weight");
  17.  
  18. using (var session = store.OpenSession())
  19. {
  20. var parcelLight = Activator.CreateInstance(parcelType);
  21. var parcelHeavy = Activator.CreateInstance(parcelType);
  22.  
  23. parcelWeight.SetValue(parcelLight, 100);
  24. parcelWeight.SetValue(parcelHeavy, 1000);
  25.  
  26. session.Insert(parcelLight, parcelHeavy);
  27.  
  28. session.SaveChanges();
  29. }
  30.  
  31. var queryByWeight = typeof(Program).GetMethod(nameof(QueryGreaterThan)).MakeGenericMethod(parcelType);
  32.  
  33. using (var session = store.OpenSession())
  34. {
  35. var heavyParcels = (IList)queryByWeight.Invoke(null, new object[] { session, "Weight", 500 });
  36. Console.WriteLine($"Parcels: {heavyParcels.Count}");
  37. }
  38. }
  39.  
  40. public static List<T> QueryGreaterThan<T>(IQuerySession session, string property, int minimum)
  41. {
  42. var t = typeof(T);
  43.  
  44. var query = typeof(IQuerySession).GetMethods()
  45. .Single(m => m.Name == "Query" && m.IsGenericMethodDefinition && m.GetParameters().Length == 0)
  46. .MakeGenericMethod(t);
  47.  
  48. var where = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public)
  49. .FirstOrDefault(x => x.Name == "Where").MakeGenericMethod(t);
  50.  
  51. var toList = typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public)
  52. .FirstOrDefault(x => x.Name == "ToList").MakeGenericMethod(t);
  53.  
  54. var parameter = Expression.Parameter(typeof(T), "p");
  55. var predicate = Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(Expression.PropertyOrField(parameter, property), Expression.Constant(minimum)), parameter);
  56.  
  57. var queryInstance = query.Invoke(session, null);
  58. var enumeration = where.Invoke(null, new[] { queryInstance, predicate });
  59.  
  60. var values = toList.Invoke(null, new[] {enumeration});
  61. return (List<T>)values;
  62. }
  63. }
  64.  
  65. public static class AssemblyGenerator
  66. {
  67. public static Assembly Generate()
  68. {
  69. var syntaxFactory = SyntaxFactory.CompilationUnit();
  70. syntaxFactory = syntaxFactory.AddUsings(SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("System")));
  71.  
  72. var @namespace = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(nameof(GeneratedType))).NormalizeWhitespace();
  73.  
  74. var classDeclaration = SyntaxFactory.ClassDeclaration("Parcel");
  75. classDeclaration = classDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword));
  76.  
  77. var idDeclaration = SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("int"), "Id")
  78. .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
  79. .AddAccessorListAccessors(
  80. SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
  81. SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)));
  82.  
  83. var weightDeclaration = SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("int"), "Weight")
  84. .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
  85. .AddAccessorListAccessors(
  86. SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
  87. SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)));
  88.  
  89. classDeclaration = classDeclaration.AddMembers(idDeclaration, weightDeclaration);
  90.  
  91. @namespace = @namespace.AddMembers(classDeclaration);
  92.  
  93. syntaxFactory = syntaxFactory.AddMembers(@namespace);
  94.  
  95. var comp = CSharpCompilation.Create(Guid.NewGuid().ToString(), new[] { syntaxFactory.SyntaxTree }, GetAssemblyReferences(), new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
  96.  
  97. using (var memStream = new MemoryStream())
  98. {
  99. comp.Emit(memStream);
  100. memStream.Seek(0, SeekOrigin.Begin);
  101. var assembly = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromStream(memStream);
  102. return assembly;
  103. }
  104. }
  105.  
  106. private static IEnumerable<MetadataReference> GetAssemblyReferences()
  107. {
  108. var references = new MetadataReference[]
  109. {
  110. MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location)
  111. };
  112. return references;
  113. }
  114. }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement