Skip to content

N_CodeJam_Metadata

Andrew Koryavchenko edited this page Jun 17, 2018 · 6 revisions

CodeJam.Metadata Namespace

The CodeJam.Metadata namespace contains type converters and object mappers.

Classes

 

Class Description
Public class MetadataException Defines the base class for the namespace exceptions.
Public class XmlAttributeReader Reads type metadata such as type and members attributes from XML.

Interfaces

 

Interface Description
Public interface IMetadataReader Metadata reader interface.

Examples

This example shows how to map one object to another. C#

[TestFixture]
public class MapTests
{
    private class Class1
    {
        public int Prop1 { get; set; }
        public string Field1;
    }

    private class Class2
    {
        public string Prop1 { get; set; }
        public DateTime? Field1;
    }

    private static readonly Mapper<Class1, Class2> _class1ToClass2Mapper =
        Map.GetMapper<Class1, Class2>();

    [Test]
    public void Test1()
    {
        // Create new Class2 and map Class1 to it.
        //
        var c2 = _class1ToClass2Mapper.Map(
            new Class1
            {
                Prop1 = 41,
                Field1 = "2016-01-01"
            });

        Assert.That(c2.Prop1, Is.EqualTo("41"));
        Assert.That(c2.Field1?.Year, Is.EqualTo(2016));

        var expr = _class1ToClass2Mapper.GetMapperExpressionEx();

        Assert.That(
            expr.GetDebugView().Remove(" ", "\t", "\r", "\n", "CodeJam.Mapping.Examples.MapTests+"),
            Is.EqualTo(@"
                .Lambda #Lambda1<System.Func`2[Class1,Class2]>(Class1 $from)
                {
                    .New Class2()
                    {
                        Prop1  = .Call ($from.Prop1).ToString(),
                        Field1 = .If ($from.Field1 != null)
                        {
                            (System.Nullable`1[System.DateTime]).Call System.DateTime.Parse(
                                $from.Field1,
                                null,
                                .Constant<System.Globalization.DateTimeStyles>(NoCurrentDateDefault))
                        } .Else {
                            null
                        }
                    }
                }".Remove(" ", "\t", "\r", "\n")));
    }

    [Test]
    public void Test2()
    {
        var c2 = new Class2();

        // Map Class1 to existing Class2.
        //
        _class1ToClass2Mapper.Map(
            new Class1
            {
                Prop1 = 41,
                Field1 = "2016-01-01"
            }, c2);

        Assert.That(c2.Prop1, Is.EqualTo("41"));
        Assert.That(c2.Field1?.Year, Is.EqualTo(2016));

        var expr = _class1ToClass2Mapper.GetMapperExpression();

        Assert.That(
            expr.GetDebugView().Remove(" ", "\t", "\r", "\n", "CodeJam.Mapping.Examples.MapTests+"),
            Is.EqualTo(@"
                .Lambda #Lambda1<System.Func`4[
                    Class1,
                    Class2,
                    System.Collections.Generic.IDictionary`2[System.Object,System.Object],
                    Class2]>
                    (
                        Class1 $from,
                        Class2 $to,
                        System.Collections.Generic.IDictionary`2[System.Object,System.Object] $dic1
                    )
                {
                    .Block(System.Collections.Generic.IDictionary`2[System.Object,System.Object] $ldic2)
                    {
                        $ldic2 = $dic1;
                        (Class2)(.Call CodeJam.Mapping.ExpressionBuilder.GetValue($ldic2,$from)
                        ??
                        .Block(Class2 $obj3)
                        {
                            $obj3 = .If ($to == null) { .New Class2() } .Else { $to };

                            .Call CodeJam.Mapping.ExpressionBuilder.Add($ldic2, $from, $obj3);

                            $obj3.Prop1  = .Call ($from.Prop1).ToString();

                            $obj3.Field1 = .If ($from.Field1 != null)
                            {
                                (System.Nullable`1[System.DateTime]).Call System.DateTime.Parse(
                                    $from.Field1,
                                    null,
                                    .Constant<System.Globalization.DateTimeStyles>(NoCurrentDateDefault))
                            }
                            .Else
                            {
                                null
                            };

                            $obj3
                        })
                    }
                }".Remove(" ", "\t", "\r", "\n")));
    }
}
Clone this wiki locally