RSCG – CopyTo

RSCG – CopyTo
 
 

name CopyTo
nuget https://www.nuget.org/packages/RhoMicro.CodeAnalysis.CopyToGenerator
link https://github.com/PaulBraetz/RhoMicro.CodeAnalysis
author Paul Braetz

Generating copy to code for properties of a class

 

This is how you can use CopyTo .

The code that you start with is


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="RhoMicro.CodeAnalysis.CopyToGenerator" Version="14.0.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>
	<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>
</Project>


The code that you will use is


using CopyToDemo;

Person p = new();
p.FirstName = "Andrei";
p.LastName = "Ignat";

Person p2 = new();
p.CopyTo(p2);
Console.WriteLine(p2.FullName); 


namespace CopyToDemo;

[RhoMicro.CodeAnalysis.GenerateCopyTo]
internal partial class Person
{
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public string FullName => $"{FirstName} {LastName}";
}


 

The code that is generated is

namespace RhoMicro.CodeAnalysis;

using System;

[global::System.AttributeUsage(AttributeTargets.Class)]
#if GENERATOR
[RhoMicro.CodeAnalysis.GenerateFactory]
#endif
internal sealed partial class GenerateCopyToAttribute : global::System.Attribute { }
// <auto-generated>
// This file was last generated by the RhoMicro.CodeAnalysis.CopyToGenerator on 2/18/2024 10:52:42 AM +02:00
// </auto-generated>
#pragma warning disable
namespace CopyToDemo
{
	partial class Person
	{
		/// <summary>
		/// Copies this instances public properties to another ones.
		/// </summary>
		/// <param name = "target">The instance to copy this instances properties' values to.</param>
		public void CopyTo(Person target)
		{
			if (this == target || target == null)
			{
				return;
			}

			if (AvoidCopy(this, target))
			{
				return;
			}

			target.FirstName = this.FirstName;
			target.LastName = this.LastName;
		}

		/// <summary>
		/// Evaluates whether copying between two instances of <see cref = "Person"/> should be avoided due to equivalence. This can help avoid unnecessary copying or infinite copying in nested recursive relationships.
		/// </summary>
		/// <param name = "a">The first instance to compare.</param>
		/// <param name = "b">The second instance to compare.</param>
		/// <param name = "result">Upon returning, contains <see langword="true"/> if copying between <paramref name = "a"/> and <paramref name = "b"/> should be avoided; otherwise, <see langword="false"/>.</param>
		static partial void AvoidCopy(Person a, Person b, ref global::System.Boolean result);
		/// <summary>
		/// Evaluates whether copying between two instances of <see cref = "Person"/> should be avoided due to equivalence. This can help avoid unnecessary copying or infinite copying in nested recursive relationships.
		/// </summary>
		/// <param name = "a">The first instance to compare.</param>
		/// <param name = "b">The second instance to compare.</param>
		/// <returns><see langword="true"/> if copying between <paramref name = "a"/> and <paramref name = "b"/> should be avoided; otherwise, <see langword="false"/>.</returns>
		static global::System.Boolean AvoidCopy(Person a, Person b)
		{
			{
				var result = false;
				AvoidCopy(a, b, ref result);
				return result;
			}
		}
	}
}

Code and pdf at

https://ignatandrei.github.io/RSCG_Examples/v2/docs/CopyTo