Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/laicasaane/typewrap
C# source generator to simplify the creation of wrapper types.
https://github.com/laicasaane/typewrap
source-generator type-library unity3d wrapper wrapping
Last synced: about 1 month ago
JSON representation
C# source generator to simplify the creation of wrapper types.
- Host: GitHub
- URL: https://github.com/laicasaane/typewrap
- Owner: laicasaane
- License: mit
- Created: 2024-02-19T08:13:41.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2024-09-24T14:24:59.000Z (3 months ago)
- Last Synced: 2024-11-29T02:14:12.231Z (about 1 month ago)
- Topics: source-generator, type-library, unity3d, wrapper, wrapping
- Language: C#
- Homepage:
- Size: 236 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# TypeWrap
This library utilizes Roslyn Source Generator to generate type wrappers for any C# type.
## Features
- Any C# type can be wrapped, with an exception of `dynamic`.
- Wrappers can be a `struct`, a `class`, or a `record`.
- A `record` wrapper can also be generic if needed.
- Wrappers have `implicit` and `explicit` operators to convert between itself and the original type.
- All public members of the original type are exposed in the wrapper. Supported members are fields, properties, events, indexers, methods, and operators.
- `IEquatable` and `IComparable` are implemented for the wrapper if the original type allows them.
- Equality operators (`==`, `!=`) are overloaded for the wrapper if the original type allows them.## Installation
### Requirements
- Unity 2022.3 or later
### Unity Package Manager
1. Open menu `Window` -> `Package Manager`.
2. Click the `+` button at the top-left corner, then choose `Add package from git URL...`.![add package by git url](imgs/add-package-by-git-url-1.png)
3. Enter the package URL `https://github.com/laicasaane/TypeWrap/tree/main/Packages/TypeWrap`.
![enter git url then press add button](imgs/add-package-by-git-url-2.png)
### OpenUPM
1. Install [OpenUPM CLI](https://openupm.com/docs/getting-started.html#installing-openupm-cli).
2. Run the following command in your Unity project root directory:```sh
openupm add com.laicasaane.typewrap
```## Usage
### [WrapType] Attribute
- Use this attribute if the wrapper itself is either a `struct` or a `class`.
- In case of a `class`, it must not inherit from any other class.
- The wrapper must be `partial`.
- By default, the underlying type name is `value`. You can change it by specifying the `memberName` argument.
- By default, a type converter is generated for the wrapper. You can exclude it by specifying the `ExcludeConverter` property.```cs
[WrapType(typeof(int))]
public partial struct IntWrapper { }[WrapType(typeof(List), memberName: "wrappedList")]
public partial class ListInt { }[WrapType(typeof(IDisposable), ExcludeConverter = true)]
public readonly partial struct DisposableObject { }
```### [WrapRecord] Attribute
- Use this attribute if the wrapper itself is either a `record struct` or a `record class`.
- In case of a `record class`, it must not inherit from any other class.
- The wrapper must be `partial`.
- The primary constructor of the record must have exactly 1 parameter.
- By default, a type converter is generated for the wrapper. You can exclude it by specifying the `ExcludeConverter` property.```cs
[WrapRecord(ExcludeConverter = true)]
public partial record struct IntWrapper(int Value);[WrapRecord]
public partial record class ListT(List _);[WrapRecord]
public readonly partial record struct Coord2D(Vector2Int _);
```#### Notes
- To have `record` in Unity, you need to use Unity 2022.3 or later, and enable `C# 10` feature by placing this `csc.rsp` file in your `Assets` folder:
https://github.com/laicasaane/TypeWrap/blob/main/Assets/csc.rsp- To have `readonly record` in any assembly (or `.asmdef`), you have to declare this class inside that assembly:
```cs
namespace System.Runtime.CompilerServices
{
[ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)]
class IsExternalInit { }
}
```- You might also want to place this file in your `Assets` **and** the root of your project to enable the `C# 10` feature for the code editor:
https://github.com/laicasaane/TypeWrap/blob/main/Directory.Build.props