diff --git a/ObjectPrinting.Tests/GlobalUsings.cs b/ObjectPrinting.Tests/GlobalUsings.cs new file mode 100644 index 00000000..cefced49 --- /dev/null +++ b/ObjectPrinting.Tests/GlobalUsings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file diff --git a/ObjectPrinting.Tests/ObjectPrinting.Tests.csproj b/ObjectPrinting.Tests/ObjectPrinting.Tests.csproj new file mode 100644 index 00000000..b86f962c --- /dev/null +++ b/ObjectPrinting.Tests/ObjectPrinting.Tests.csproj @@ -0,0 +1,25 @@ + + + + net6.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + diff --git a/ObjectPrinting.Tests/Tests/Node.cs b/ObjectPrinting.Tests/Tests/Node.cs new file mode 100644 index 00000000..98e11651 --- /dev/null +++ b/ObjectPrinting.Tests/Tests/Node.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ObjectPrinting.Tests.Tests +{ + public class Node + { + public int Value { get; set; } + public Node Next { get; set; } + } +} diff --git a/ObjectPrinting.Tests/Tests/ObjectPrinterAcceptanceTests.cs b/ObjectPrinting.Tests/Tests/ObjectPrinterAcceptanceTests.cs new file mode 100644 index 00000000..fbe87890 --- /dev/null +++ b/ObjectPrinting.Tests/Tests/ObjectPrinterAcceptanceTests.cs @@ -0,0 +1,210 @@ +using FluentAssertions; +using FluentAssertions.Primitives; +using NUnit.Framework; +using System.Globalization; +using System.Reflection; + +namespace ObjectPrinting.Tests.Tests +{ + [TestFixture] + public class ObjectPrinterAcceptanceTests + { + private Person person; + private PrintingConfig personPrinter; + + [SetUp] + public void SetUp() + { + person = new Person() + { + Id = Guid.NewGuid(), + Name = "John Doe", + Height = 175.5 + }; + personPrinter = ObjectPrinter.For(); + } + + [Test] + public void PrintListOfInts_ReturnCorrectString() + { + var list = new List() { 1, 2, 3 }; + var printer = ObjectPrinter.For>(); + + var actual = printer.PrintToString(list); + + Assert.AreEqual("[1,2,3]", actual); + } + + [Test] + public void PrintArrayOfInts_ReturnCorrectString() + { + var list = new int[] { 1, 2, 3 }; + var printer = ObjectPrinter.For(); + + var actual = printer.PrintToString(list); + + Assert.AreEqual("[1,2,3]", actual); + } + + [Test] + public void PrintListDictOfStrings_ReturnCorrectString() + { + var dict = new Dictionary + { + { 1, "a" }, + { 2, "b" } + }; + var printer = ObjectPrinter.For>(); + + var actual = printer.PrintToString(dict); + + Assert.AreEqual("{1 : a,2 : b}", actual); + } + + [Test] + public void ExcludeProperty_Success() + { + personPrinter.Excluding(o => o.Height); + + var actual = personPrinter.PrintToString(person); + + StringAssert.DoesNotContain("Height", actual); + } + + [Test] + public void ExcludeType_Success() + { + personPrinter.Excluding(); + + var actual = personPrinter.PrintToString(person); + + StringAssert.DoesNotContain("Id", actual); + } + + [Test] + public void PrintForTypes_Success() + { + personPrinter.Print().Using(o => "ABCDEF"); + + var actual = personPrinter.PrintToString(person); + + StringAssert.Contains("ABCDEF", actual); + } + + [Test] + public void PrintForProperties_Success() + { + personPrinter.Print(o => o.Name).Using(o => "ABCDEF"); + + var actual = personPrinter.PrintToString(person); + + StringAssert.Contains("ABCDEF", actual); + } + + [Test] + public void TruncateString_Success() + { + personPrinter.Print().TruncateLength(6); + + var actual = personPrinter.PrintToString(person); + + StringAssert.DoesNotContain("John Do", actual); + StringAssert.Contains("John D", actual); + } + + [Test] + public void SetMaxStringLengthViaConfigure_Success() + { + personPrinter.Configure(opt => opt.MaxStringLength = 6); + + var actual = personPrinter.PrintToString(person); + + StringAssert.DoesNotContain("John Do", actual); + StringAssert.Contains("John D", actual); + } + + [TestCase("ru-RU")] + [TestCase("en-US")] + [TestCase("fr-FR")] + public void SetCulture_ShouldApplyCulture(string code) + { + var culture = new CultureInfo(code); + personPrinter.Print() + .SetCulture(culture); + var should = person.Height.ToString(culture); + + + var actual = personPrinter.PrintToString(person); + + + StringAssert.Contains(should, actual); + } + + [TestCase("ru-RU")] + [TestCase("en-US")] + [TestCase("fr-FR")] + public void SetCultureViaConfigure_ShouldApplyCulture(string code) + { + var culture = new CultureInfo(code); + personPrinter.Configure(opt => opt.CultureInfo = culture); + var should = person.Height.ToString(culture); + + + var actual = personPrinter.PrintToString(person); + + + StringAssert.Contains(should, actual); + } + + [Test] + public void CyclicReference_DoesnThrowStackOverflow() + { + var node1 = new Node() { Value = 1 }; + var node2 = new Node() { Value = 2 }; + node1.Next = node2; + node2.Next = node1; + var printer = ObjectPrinter.For(); + + Console.WriteLine(printer.PrintToString(node1)); + Assert.DoesNotThrow(() => printer.PrintToString(node1)); + } + + [Test] + public void Demo() + { + var person = new Person { Name = "Alex", Age = 19, Height = 172.1, + Father = new Parent() { Name = "Bob Robinson", Age = 54, Height = 182.2}, + Mother = new Parent() { Name = "Sara Robinson", Age = 50, Height = 185.4} + }; + + var printer = ObjectPrinter.For(); + //1. Исключить из сериализации свойства определенного типа + //2. Указать альтернативный способ сериализации для определенного типа + //3. Для числовых типов указать культуру + //4. Настроить сериализацию конкретного свойства + //5. Настроить обрезание строковых свойств (метод должен быть виден только для строковых свойств) + //6. Исключить из сериализации конкретного свойства + + printer.Excluding(o => o.Id) + .Print(o => o.Height) + .Using(h => $"{h} сантиметров") + .Print(o => o.Name) + .TruncateLength(10) + .Configure(opts => + { + opts.MaxStringLength = 100; + opts.CultureInfo = CultureInfo.InvariantCulture; + }); + + + + string s1 = printer.PrintToString(person); + + Console.WriteLine(s1); + + s1.Should().Be(s1); + //7. Синтаксический сахар в виде метода расширения, сериализующего по-умолчанию + //8. ...с конфигурированием + } + } +} \ No newline at end of file diff --git a/ObjectPrinting/Solved/Tests/Person.cs b/ObjectPrinting.Tests/Tests/Person.cs similarity index 55% rename from ObjectPrinting/Solved/Tests/Person.cs rename to ObjectPrinting.Tests/Tests/Person.cs index 858ebbf8..1032303e 100644 --- a/ObjectPrinting/Solved/Tests/Person.cs +++ b/ObjectPrinting.Tests/Tests/Person.cs @@ -1,6 +1,6 @@ using System; -namespace ObjectPrinting.Solved.Tests +namespace ObjectPrinting.Tests.Tests { public class Person { @@ -8,5 +8,12 @@ public class Person public string Name { get; set; } public double Height { get; set; } public int Age { get; set; } + public Parent Father { get; set; } + public Parent Mother { get; set; } + } + + public class Parent : Person + { + } } \ No newline at end of file diff --git a/ObjectPrinting/Configuration.cs b/ObjectPrinting/Configuration.cs new file mode 100644 index 00000000..14928347 --- /dev/null +++ b/ObjectPrinting/Configuration.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace ObjectPrinting +{ + public class Configuration + { + public List ToExclude; + public List<(Predicate predicate, Func serializer)> Serializers; + public Options Options; + + public Configuration + (List toExclude = null, + List<(Predicate predicate, Func serializer)> serializers =null) + { + ToExclude = toExclude ?? new List(); + Serializers = serializers ?? new List<(Predicate predicate, Func serializer)>(); + Options = new Options(); + } + } +} diff --git a/ObjectPrinting/ObjectPrinter.cs b/ObjectPrinting/ObjectPrinter.cs index 3c7867c3..8ac52602 100644 --- a/ObjectPrinting/ObjectPrinter.cs +++ b/ObjectPrinting/ObjectPrinter.cs @@ -6,5 +6,10 @@ public static PrintingConfig For() { return new PrintingConfig(); } + + public static string Print(T obj) + { + return new PrintingConfig().PrintToString(obj); + } } } \ No newline at end of file diff --git a/ObjectPrinting/ObjectPrinting.csproj b/ObjectPrinting/ObjectPrinting.csproj index 1c5eaf1c..d7f3a084 100644 --- a/ObjectPrinting/ObjectPrinting.csproj +++ b/ObjectPrinting/ObjectPrinting.csproj @@ -6,9 +6,4 @@ false - - - - - diff --git a/ObjectPrinting/Options.cs b/ObjectPrinting/Options.cs new file mode 100644 index 00000000..d3083314 --- /dev/null +++ b/ObjectPrinting/Options.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace ObjectPrinting +{ + public class Options + { + public int MaxStringLength = -1; + public CultureInfo CultureInfo = CultureInfo.InvariantCulture; + public int MaxRecursionDepth = 10; + } +} diff --git a/ObjectPrinting/PrintingConfig.cs b/ObjectPrinting/PrintingConfig.cs deleted file mode 100644 index a9e08211..00000000 --- a/ObjectPrinting/PrintingConfig.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Linq; -using System.Text; - -namespace ObjectPrinting -{ - public class PrintingConfig - { - public string PrintToString(TOwner obj) - { - return PrintToString(obj, 0); - } - - private string PrintToString(object obj, int nestingLevel) - { - //TODO apply configurations - if (obj == null) - return "null" + Environment.NewLine; - - var finalTypes = new[] - { - typeof(int), typeof(double), typeof(float), typeof(string), - typeof(DateTime), typeof(TimeSpan) - }; - if (finalTypes.Contains(obj.GetType())) - return obj + Environment.NewLine; - - var identation = new string('\t', nestingLevel + 1); - var sb = new StringBuilder(); - var type = obj.GetType(); - sb.AppendLine(type.Name); - foreach (var propertyInfo in type.GetProperties()) - { - sb.Append(identation + propertyInfo.Name + " = " + - PrintToString(propertyInfo.GetValue(obj), - nestingLevel + 1)); - } - return sb.ToString(); - } - } -} \ No newline at end of file diff --git a/ObjectPrinting/PrintingConfig/PrintingConfig.cs b/ObjectPrinting/PrintingConfig/PrintingConfig.cs new file mode 100644 index 00000000..78427e28 --- /dev/null +++ b/ObjectPrinting/PrintingConfig/PrintingConfig.cs @@ -0,0 +1,123 @@ +using Microsoft.VisualBasic; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; + +namespace ObjectPrinting +{ + public delegate bool Predicate(PropertyInfo info); + public partial class PrintingConfig + { + private Configuration configuration; + + private readonly Type[] finalTypes; + + public PrintingConfig() + { + configuration = new Configuration(); + + finalTypes = new[] + { + typeof(int), typeof(double), typeof(float), typeof(string), + typeof(DateTime), typeof(TimeSpan) + }; + } + + public PrintingConfig Configure(Action configure) + { + var opts = new Options(); + + configure(opts); + + configuration.Options = opts; + + return this; + } + + public string PrintToString(TOwner obj) + { + return PrintToString(obj, 0); + } + + private string PrintToString(object obj, int nestingLevel) + { + if (obj == null) + return "null"; + + if (obj.GetType() == typeof(string) && configuration.Options.MaxStringLength != -1) + { + var str = (string)obj; + var length = Math.Min(configuration.Options.MaxStringLength, str.Length); + return str.Substring(0, length); + } + + if (finalTypes.Contains(obj.GetType())) + return Convert.ToString(obj, configuration.Options.CultureInfo); + + if (nestingLevel > configuration.Options.MaxRecursionDepth) + return "..."; + + if (obj is ICollection) + return PrintCollection(obj); + + var identation = new string('\t', nestingLevel + 1); + var type = obj.GetType(); + var lines = new List() { type.Name}; + + var properties = type.GetProperties().Where(p => !ToExclude(p)).ToList(); + + foreach (var propertyInfo in properties) + { + var serialized = ""; + if (TryGetConfig(propertyInfo, out var serializer)) + serialized = serializer(propertyInfo.GetValue(obj)); + else + serialized = PrintToString(propertyInfo.GetValue(obj), + nestingLevel + 1); + + var line = string.Format("{0}{1} = {2}", + identation, propertyInfo.Name, serialized); + + lines.Add(line); + } + + return string.Join("\n", lines); + } + + private string PrintCollection(object obj) + { + if (obj is IDictionary) + { + var list = new List(); + foreach (DictionaryEntry entry in obj as IDictionary) + { + list.Add($"{PrintToString(entry.Key, 0)} : {PrintToString(entry.Value, 0)}"); + } + return $"{{{string.Join(",", list)}}}"; + } + else + { + var collection = (obj as ICollection).Cast(); + var str = string.Join(",", collection.Select(x => PrintToString(x, 0))); + return $"[{str}]"; + } + } + + private bool TryGetConfig(PropertyInfo info, out Func serializer) + { + serializer = configuration.Serializers + .FirstOrDefault(x => x.predicate(info)) + .serializer; + return !(serializer is null); + } + + private bool ToExclude(PropertyInfo info) + { + return configuration.ToExclude.Any(predicate => predicate(info)); + } + } +} \ No newline at end of file diff --git a/ObjectPrinting/PrintingConfig/PrintingConfigExcluding.cs b/ObjectPrinting/PrintingConfig/PrintingConfigExcluding.cs new file mode 100644 index 00000000..0bd8f349 --- /dev/null +++ b/ObjectPrinting/PrintingConfig/PrintingConfigExcluding.cs @@ -0,0 +1,30 @@ +using System; +using System.Linq.Expressions; + +namespace ObjectPrinting +{ + public partial class PrintingConfig + { + public PrintingConfig Excluding(Expression> selector) + { + var member = ReflectionHelpers.GetMemberFromExpression(selector); + + configuration.ToExclude.Add(info => info.Name == member.Name); + + return this; + } + public PrintingConfig Excluding() + { + configuration.ToExclude.Add(info => info.PropertyType == typeof(TType)); + + return this; + } + + private PrintingConfig Excluding(Predicate predicate) + { + configuration.ToExclude.Add(predicate); + + return this; + } + } +} diff --git a/ObjectPrinting/PrintingConfig/PrintingConfigPrint.cs b/ObjectPrinting/PrintingConfig/PrintingConfigPrint.cs new file mode 100644 index 00000000..812689cb --- /dev/null +++ b/ObjectPrinting/PrintingConfig/PrintingConfigPrint.cs @@ -0,0 +1,32 @@ +using System; +using System.Linq.Expressions; +using System.Threading; + +namespace ObjectPrinting +{ + public partial class PrintingConfig + { + public PropertyPrintingConfig Print + (Expression> selector) + { + var member = ReflectionHelpers.GetMemberFromExpression(selector); + + Predicate predicate = info => info.Name == member.Name; + + var propertyConfig = + new PropertyPrintingConfig(this, configuration, predicate); + + return propertyConfig; + } + + public PropertyPrintingConfig Print() + { + Predicate predicate = info => info.PropertyType == typeof(TType); + + var propertyConfig = + new PropertyPrintingConfig(this, configuration, predicate); + + return propertyConfig; + } + } +} diff --git a/ObjectPrinting/PropertyPrintingConfig.cs b/ObjectPrinting/PropertyPrintingConfig.cs new file mode 100644 index 00000000..a5acb78e --- /dev/null +++ b/ObjectPrinting/PropertyPrintingConfig.cs @@ -0,0 +1,32 @@ +using System; + +namespace ObjectPrinting +{ + public class PropertyPrintingConfig + { + public PrintingConfig Parent => parent; + + private readonly PrintingConfig parent; + private readonly Configuration configuration; + private readonly Predicate selector; + + public PropertyPrintingConfig + (PrintingConfig parent, + Configuration configuration, + Predicate selector) + { + this.parent = parent; + this.configuration = configuration; + this.selector = selector; + } + + public PrintingConfig Using(Func toString) + { + Func serializer = o => toString((TOwner)o); + + configuration.Serializers.Add((selector, serializer)); + + return parent; + } + } +} diff --git a/ObjectPrinting/PropertyPrintingConfigExtensions.cs b/ObjectPrinting/PropertyPrintingConfigExtensions.cs new file mode 100644 index 00000000..cab28732 --- /dev/null +++ b/ObjectPrinting/PropertyPrintingConfigExtensions.cs @@ -0,0 +1,35 @@ +using System; +using System.Globalization; + +namespace ObjectPrinting +{ + public static class PropertyPrintingConfigExtensions + { + public static PrintingConfig TruncateLength + (this PropertyPrintingConfig config, + int maxLength) + { + config.Using(o => o.Substring(0, Math.Min(maxLength, o.Length))); + + return config.Parent; + } + + public static PrintingConfig SetCulture + (this PropertyPrintingConfig config, + CultureInfo culture) + { + config.Using(o => o.ToString(culture)); + + return config.Parent; + } + + public static PrintingConfig SetCulture + (this PropertyPrintingConfig config, + CultureInfo culture) + { + config.Using(o => o.ToString(culture)); + + return config.Parent; + } + } +} \ No newline at end of file diff --git a/ObjectPrinting/ReflectionHelpers.cs b/ObjectPrinting/ReflectionHelpers.cs new file mode 100644 index 00000000..7cc8784c --- /dev/null +++ b/ObjectPrinting/ReflectionHelpers.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; + +namespace ObjectPrinting +{ + public static class ReflectionHelpers + { + public static MemberInfo GetMemberFromExpression + (Expression> expression) + { + var body = expression.Body; + + var member = body as MemberExpression; + + if (member == null) + { + member = (expression.Body as UnaryExpression)?.Operand as MemberExpression; + } + if (member == null) + { + throw new ArgumentException("Action must be a member expression."); + } + + return member.Member; + } + } +} diff --git a/ObjectPrinting/Solved/ObjectExtensions.cs b/ObjectPrinting/Solved/ObjectExtensions.cs deleted file mode 100644 index b0c94553..00000000 --- a/ObjectPrinting/Solved/ObjectExtensions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ObjectPrinting.Solved -{ - public static class ObjectExtensions - { - public static string PrintToString(this T obj) - { - return ObjectPrinter.For().PrintToString(obj); - } - } -} \ No newline at end of file diff --git a/ObjectPrinting/Solved/ObjectPrinter.cs b/ObjectPrinting/Solved/ObjectPrinter.cs deleted file mode 100644 index 540ee769..00000000 --- a/ObjectPrinting/Solved/ObjectPrinter.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ObjectPrinting.Solved -{ - public class ObjectPrinter - { - public static PrintingConfig For() - { - return new PrintingConfig(); - } - } -} \ No newline at end of file diff --git a/ObjectPrinting/Solved/PrintingConfig.cs b/ObjectPrinting/Solved/PrintingConfig.cs deleted file mode 100644 index 0ec5aeb2..00000000 --- a/ObjectPrinting/Solved/PrintingConfig.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Linq; -using System.Linq.Expressions; -using System.Text; - -namespace ObjectPrinting.Solved -{ - public class PrintingConfig - { - public PropertyPrintingConfig Printing() - { - return new PropertyPrintingConfig(this); - } - - public PropertyPrintingConfig Printing(Expression> memberSelector) - { - return new PropertyPrintingConfig(this); - } - - public PrintingConfig Excluding(Expression> memberSelector) - { - return this; - } - - internal PrintingConfig Excluding() - { - return this; - } - - public string PrintToString(TOwner obj) - { - return PrintToString(obj, 0); - } - - private string PrintToString(object obj, int nestingLevel) - { - //TODO apply configurations - if (obj == null) - return "null" + Environment.NewLine; - - var finalTypes = new[] - { - typeof(int), typeof(double), typeof(float), typeof(string), - typeof(DateTime), typeof(TimeSpan) - }; - if (finalTypes.Contains(obj.GetType())) - return obj + Environment.NewLine; - - var identation = new string('\t', nestingLevel + 1); - var sb = new StringBuilder(); - var type = obj.GetType(); - sb.AppendLine(type.Name); - foreach (var propertyInfo in type.GetProperties()) - { - sb.Append(identation + propertyInfo.Name + " = " + - PrintToString(propertyInfo.GetValue(obj), - nestingLevel + 1)); - } - return sb.ToString(); - } - } -} \ No newline at end of file diff --git a/ObjectPrinting/Solved/PropertyPrintingConfig.cs b/ObjectPrinting/Solved/PropertyPrintingConfig.cs deleted file mode 100644 index a509697d..00000000 --- a/ObjectPrinting/Solved/PropertyPrintingConfig.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Globalization; - -namespace ObjectPrinting.Solved -{ - public class PropertyPrintingConfig : IPropertyPrintingConfig - { - private readonly PrintingConfig printingConfig; - - public PropertyPrintingConfig(PrintingConfig printingConfig) - { - this.printingConfig = printingConfig; - } - - public PrintingConfig Using(Func print) - { - return printingConfig; - } - - public PrintingConfig Using(CultureInfo culture) - { - return printingConfig; - } - - PrintingConfig IPropertyPrintingConfig.ParentConfig => printingConfig; - } - - public interface IPropertyPrintingConfig - { - PrintingConfig ParentConfig { get; } - } -} \ No newline at end of file diff --git a/ObjectPrinting/Solved/PropertyPrintingConfigExtensions.cs b/ObjectPrinting/Solved/PropertyPrintingConfigExtensions.cs deleted file mode 100644 index dd392239..00000000 --- a/ObjectPrinting/Solved/PropertyPrintingConfigExtensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace ObjectPrinting.Solved -{ - public static class PropertyPrintingConfigExtensions - { - public static string PrintToString(this T obj, Func, PrintingConfig> config) - { - return config(ObjectPrinter.For()).PrintToString(obj); - } - - public static PrintingConfig TrimmedToLength(this PropertyPrintingConfig propConfig, int maxLen) - { - return ((IPropertyPrintingConfig)propConfig).ParentConfig; - } - - } -} \ No newline at end of file diff --git a/ObjectPrinting/Solved/Tests/ObjectPrinterAcceptanceTests.cs b/ObjectPrinting/Solved/Tests/ObjectPrinterAcceptanceTests.cs deleted file mode 100644 index ac52d5ee..00000000 --- a/ObjectPrinting/Solved/Tests/ObjectPrinterAcceptanceTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Globalization; -using NUnit.Framework; - -namespace ObjectPrinting.Solved.Tests -{ - [TestFixture] - public class ObjectPrinterAcceptanceTests - { - [Test] - public void Demo() - { - var person = new Person { Name = "Alex", Age = 19 }; - - var printer = ObjectPrinter.For() - //1. Исключить из сериализации свойства определенного типа - .Excluding() - //2. Указать альтернативный способ сериализации для определенного типа - .Printing().Using(i => i.ToString("X")) - //3. Для числовых типов указать культуру - .Printing().Using(CultureInfo.InvariantCulture) - //4. Настроить сериализацию конкретного свойства - //5. Настроить обрезание строковых свойств (метод должен быть виден только для строковых свойств) - .Printing(p => p.Name).TrimmedToLength(10) - //6. Исключить из сериализации конкретного свойства - .Excluding(p => p.Age); - - string s1 = printer.PrintToString(person); - - //7. Синтаксический сахар в виде метода расширения, сериализующего по-умолчанию - string s2 = person.PrintToString(); - - //8. ...с конфигурированием - string s3 = person.PrintToString(s => s.Excluding(p => p.Age)); - Console.WriteLine(s1); - Console.WriteLine(s2); - Console.WriteLine(s3); - } - } -} \ No newline at end of file diff --git a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs b/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs deleted file mode 100644 index 4c8b2445..00000000 --- a/ObjectPrinting/Tests/ObjectPrinterAcceptanceTests.cs +++ /dev/null @@ -1,27 +0,0 @@ -using NUnit.Framework; - -namespace ObjectPrinting.Tests -{ - [TestFixture] - public class ObjectPrinterAcceptanceTests - { - [Test] - public void Demo() - { - var person = new Person { Name = "Alex", Age = 19 }; - - var printer = ObjectPrinter.For(); - //1. Исключить из сериализации свойства определенного типа - //2. Указать альтернативный способ сериализации для определенного типа - //3. Для числовых типов указать культуру - //4. Настроить сериализацию конкретного свойства - //5. Настроить обрезание строковых свойств (метод должен быть виден только для строковых свойств) - //6. Исключить из сериализации конкретного свойства - - string s1 = printer.PrintToString(person); - - //7. Синтаксический сахар в виде метода расширения, сериализующего по-умолчанию - //8. ...с конфигурированием - } - } -} \ No newline at end of file diff --git a/ObjectPrinting/Tests/Person.cs b/ObjectPrinting/Tests/Person.cs deleted file mode 100644 index f9555955..00000000 --- a/ObjectPrinting/Tests/Person.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace ObjectPrinting.Tests -{ - public class Person - { - public Guid Id { get; set; } - public string Name { get; set; } - public double Height { get; set; } - public int Age { get; set; } - } -} \ No newline at end of file diff --git a/fluent-api.sln b/fluent-api.sln index 69c8db9e..ef062e8c 100644 --- a/fluent-api.sln +++ b/fluent-api.sln @@ -1,17 +1,19 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33424.131 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectPrinting", "ObjectPrinting\ObjectPrinting.csproj", "{07B8C9B7-8289-46CB-9875-048A57758EEE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ObjectPrinting", "ObjectPrinting\ObjectPrinting.csproj", "{07B8C9B7-8289-46CB-9875-048A57758EEE}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{6D308E4A-CEC7-4536-9B87-81CD337A87AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentMapping", "Samples\FluentMapper\FluentMapping.csproj", "{FEEA5AFE-459A-4D13-81D0-252E1A2E6F4E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FluentMapping", "Samples\FluentMapper\FluentMapping.csproj", "{FEEA5AFE-459A-4D13-81D0-252E1A2E6F4E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FluentMapping.Tests", "Samples\FluentMapper.Tests\FluentMapping.Tests.csproj", "{8A7BB3EA-3E6A-4D04-A801-D5CD1620DA0D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FluentMapping.Tests", "Samples\FluentMapper.Tests\FluentMapping.Tests.csproj", "{8A7BB3EA-3E6A-4D04-A801-D5CD1620DA0D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spectacle", "Samples\Spectacle\Spectacle.csproj", "{EFA9335C-411B-4597-B0B6-5438D1AE04C3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectacle", "Samples\Spectacle\Spectacle.csproj", "{EFA9335C-411B-4597-B0B6-5438D1AE04C3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectPrinting.Tests", "ObjectPrinting.Tests\ObjectPrinting.Tests.csproj", "{0231F8F6-19B6-428D-A2E2-1FFF388E460D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -35,6 +37,10 @@ Global {EFA9335C-411B-4597-B0B6-5438D1AE04C3}.Debug|Any CPU.Build.0 = Debug|Any CPU {EFA9335C-411B-4597-B0B6-5438D1AE04C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {EFA9335C-411B-4597-B0B6-5438D1AE04C3}.Release|Any CPU.Build.0 = Release|Any CPU + {0231F8F6-19B6-428D-A2E2-1FFF388E460D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0231F8F6-19B6-428D-A2E2-1FFF388E460D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0231F8F6-19B6-428D-A2E2-1FFF388E460D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0231F8F6-19B6-428D-A2E2-1FFF388E460D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -44,4 +50,7 @@ Global {8A7BB3EA-3E6A-4D04-A801-D5CD1620DA0D} = {6D308E4A-CEC7-4536-9B87-81CD337A87AD} {EFA9335C-411B-4597-B0B6-5438D1AE04C3} = {6D308E4A-CEC7-4536-9B87-81CD337A87AD} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {519829AA-EBFB-40E6-A8EF-2F3546EEBD57} + EndGlobalSection EndGlobal