{"id":18300768,"url":"https://github.com/stratosblue/lightweightobjectmapper","last_synced_at":"2025-10-08T05:48:12.515Z","repository":{"id":147781143,"uuid":"619091620","full_name":"stratosblue/LightweightObjectMapper","owner":"stratosblue","description":"A out of the box object mapper library based on `SourceGenerator`. 基于 `SourceGenerator` 的开箱即用对象映射库。","archived":false,"fork":false,"pushed_at":"2025-07-09T14:55:25.000Z","size":118,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-20T22:14:03.885Z","etag":null,"topics":["fields-copy","lmapper","lom","lomapper","mapper","object-mapper","objectmapper","properties-copy","source-generator","sourcegenerator"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stratosblue.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-03-26T08:39:01.000Z","updated_at":"2025-07-09T14:54:50.000Z","dependencies_parsed_at":"2024-12-23T02:11:45.738Z","dependency_job_id":"0b08819e-44a4-4ad1-a21d-e0d5ec748e51","html_url":"https://github.com/stratosblue/LightweightObjectMapper","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/stratosblue/LightweightObjectMapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stratosblue%2FLightweightObjectMapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stratosblue%2FLightweightObjectMapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stratosblue%2FLightweightObjectMapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stratosblue%2FLightweightObjectMapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stratosblue","download_url":"https://codeload.github.com/stratosblue/LightweightObjectMapper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stratosblue%2FLightweightObjectMapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278896740,"owners_count":26064772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fields-copy","lmapper","lom","lomapper","mapper","object-mapper","objectmapper","properties-copy","source-generator","sourcegenerator"],"created_at":"2024-11-05T15:13:20.311Z","updated_at":"2025-10-08T05:48:12.499Z","avatar_url":"https://github.com/stratosblue.png","language":"C#","readme":"﻿# LightweightObjectMapper\n\n## 1. Intro\n\nA out of the box object mapper library based on `SourceGenerator`. 基于 `SourceGenerator` 的开箱即用对象映射库。\n\n## 2. Features\n\n- 开箱即用、无需预配置（Out of the box, no pre-configuration required）\n- 无运行库引用（No runtime library reference）\n- 映射代码可观察（Observable mapping code）\n- 无反射（No Reflection）\n- 无Emit或其它动态生成（No emit or other dynamic generations）\n- 基于拓展方法实现，不侵入目标类型（Implementation based on extension methods, non intrusive target type）\n\n### Note!!!\n - 基于 `SourceGenerator` 实现，约等价于手写代码，无法实现手写代码不能实现的功能，如：访问私有字段、访问私有构造函数等。\n - 当前不会自动处理嵌套类型映射，需要手动映射嵌套类型后才能正常工作。\n\n## 3. 使用方法\n\n### 3.1 引用包\n```xml\n\u003cItemGroup\u003e\n  \u003cPackageReference Include=\"LightweightObjectMapper\" Version=\"1.0.0\" /\u003e\n\u003c/ItemGroup\u003e\n```\n\n### 3.2 快速使用\n\n无配置文件的使用方式，引用命名空间 `LightweightObjectMapper` ，直接使用拓展方法 `MapTo` 进行映射；\n\n```C#\nusing LightweightObjectMapper;\n\nclass Class1 { }\nclass Class2 { }\nstruct Struct1 { }\n\nclass1Instance.MapTo\u003cClass2\u003e();\nclass1Instance.MapTo(class2Instance);\n\nclass1Instance.MapTo(ref struct1Instance);\n\nvar list1 = new List\u003cClass1\u003e();\nlist1.MapTo\u003cIEnumerable\u003cClass2\u003e\u003e();\n```\n\n### 3.3 配置映射 `MappingProfile`\n\n - 创建 `MappingProfile` 类：\n    ```C#\n    [MappingProfile]\n    internal partial class SampleMappingProfile\n    {\n    }\n    ```\n    - 使用特性 `[MappingProfile]` 标记类型；\n    - 将类型声明为 `partial`；\n\n - 为 `SampleMappingProfile` 实现对应的配置接口：\n    - `IMappingPrepare\u003cTIn, TOut\u003e`：映射前准备。用于使用 `TIn` 映射到 `TOut` 时初始化 `TOut`；\n    - `IPostMapping\u003cTIn, TOut\u003e`：映射后执行的动作。用于使用 `TIn` 映射到 `TOut` 完成后，执行的后续附加代码；\n    - `ITypeMapping\u003cTIn, TOut\u003e`：接管完整的类型映射。（仅非目标实例映射时有效）；\n    - `ITypeMemberIgnoreMapping\u003cT\u003e`：类型成员忽略映射声明。声明映射到目标类型 `T` 时，应忽略的 `T` 的成员；\n\n - 拓展集合映射：\n    - 默认支持`T[]`、`List\u003cT\u003e`、`IEnumerable\u003cT\u003e`等基础集合映射；\n    - 自定义集合映射：\n        - 在 `MappingProfile` 类内部声明任意名称静态方法；\n        - 使用特性 `[CollectionMapping]` 标记该方法；\n        - 该方法必须包含一个`泛型参数`；\n        - 该方法必须有一个参数，且参数类型为 `IEnumerable\u003c泛型参数\u003e`；\n        - 该方法的返回值类型必须派生自 `IEnumerable\u003c泛型参数\u003e`；\n\n - 示例：\n ```C#\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing LightweightObjectMapper;\n\nnamespace MappingProfileSample;\n\nclass MyClass1\n{\n    public int MyProperty1 { get; set; }\n\n    public int MyProperty2 { get; set; }\n\n    public int MyProperty3 { get; set; }\n}\n\nclass MyClass2\n{\n    public int MyProperty1 { get; set; }\n\n    public int MyProperty2 { get; set; }\n\n    public int MyProperty3 { get; set; }\n}\n\n[MappingProfile]\ninternal partial class SampleMappingProfile\n    : IMappingPrepare\u003cMyClass1, MyClass2\u003e\n    , IPostMapping\u003cMyClass1, MyClass2\u003e\n    , ITypeMapping\u003cMyClass2, MyClass1\u003e\n    , ITypeMemberIgnoreMapping\u003cMyClass2\u003e\n{\n    public object? IgnoreMapping(MyClass2 target)\n    {\n        // 映射到 MyClass2 时忽略其 MyProperty2\n        return new\n        {\n            target.MyProperty2,\n        };\n    }\n\n    public MyClass2 MappingPrepare(MyClass1 source)\n    {\n        // MyClass1 映射到 MyClass2 时，MyClass2 实例的创建方式\n        return new MyClass2()\n        {\n            MyProperty1 = 1\n        };\n    }\n\n    public MyClass2 PostMapping(MyClass1 source, MyClass2 target)\n    {\n        // MyClass1 映射到 MyClass2 时，映射完成后执行的代码\n        target.MyProperty1 = source.MyProperty1 * 2;\n        return target;\n    }\n\n    public MyClass1 TypeMapping(MyClass2 source)\n    {\n        //接管 MyClass2 到 MyClass1 的映射\n        return new MyClass1()\n        {\n            MyProperty1 = source.MyProperty1 / 2\n        };\n    }\n\n    [CollectionMapping]\n    public static ConcurrentBag\u003cT\u003e? ToList\u003cT\u003e(IEnumerable\u003cT\u003e? items)\n    {\n        //拓展对 ConcurrentBag 的映射支持\n        return items is null ? null : new ConcurrentBag\u003cT\u003e(items);\n    }\n}\n ```\n\n### 3.4 引入其它程序集内的 `MappingProfile`\n跨程序集共享 `MappingProfile`。\n - 将要进行共享的 `MappingProfile` 声明为 `public`；\n - 在需要引用此 `MappingProfile` 的程序集内定义新的 `MappingProfile`，并对其添加特性 `[MappingProfileInclude]` 进行引用；\n - 示例：\n ```C#\n // 引用 InternalMappingProfile 和 InternalMappingProfile1\n [MappingProfileInclude(typeof(InternalMappingProfile), typeof(InternalMappingProfile1))]\n [MappingProfile]\n internal partial class MappingProfileIncludeMapProfile1\n {\n }\n ```\n\n### 4. 其它配置\n配置项目的 `Property` 来进行一些特殊配置，示例：\n```xml\n  \u003cPropertyGroup\u003e\n    \u003c!--不添加预生成代码--\u003e\n    \u003cNoLightweightObjectMapperPreCodes\u003etrue\u003c/NoLightweightObjectMapperPreCodes\u003e\n    \u003c!--设置生成的拓展方法可访问性--\u003e\n    \u003cLOMappingMethodAccessibility\u003epublic\u003c/LOMappingMethodAccessibility\u003e\n  \u003c/PropertyGroup\u003e\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstratosblue%2Flightweightobjectmapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstratosblue%2Flightweightobjectmapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstratosblue%2Flightweightobjectmapper/lists"}