RSCG – AutoInterface

RSCG – AutoInterface
 
 

name AutoInterface
nuget https://www.nuget.org/packages/AutoInterface/
link https://github.com/BlackWhiteYoshi/AutoInterface
author Black White Yoshi

generating interface from a class

 

This is how you can use AutoInterface .

The code that you start with is


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

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

	<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>

	<ItemGroup>
	  <PackageReference Include="AutoInterface" Version="2.4.0">
	    <PrivateAssets>all</PrivateAssets>
	    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
	  </PackageReference>
	</ItemGroup>
</Project>


The code that you will use is


using NullInterface;

Console.WriteLine("Hello, World!");

Console.WriteLine("Hello, World!");
IDepartment department = new Department();
department.Name = "IT";
IEmployee employee = new Employee();
employee.FirstName = "Andrei";
employee.Department = department;
Console.WriteLine(employee.FirstName);
Console.WriteLine(employee.Department.Name);
Console.WriteLine(employee.GetFullNameAndDepartment(" - "));





using AutoInterfaceAttributes;

namespace NullInterface;

[AutoInterface]
public class Department : IDepartment
{
    public string Name { get; set; } = string.Empty;
}





using AutoInterfaceAttributes;

namespace NullInterface;


    [AutoInterface]
public class Employee: IEmployee
{
    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;
    public IDepartment Department { get; set; }
    public string GetFullName()=> $"{FirstName} {LastName}";

    public string GetFullNameAndDepartment(string separator)=> $"{GetFullName()}{separator}{ Department?.Name}";
    
}


 

The code that is generated is

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !AUTOINTERFACE_EXCLUDE_ATTRIBUTES

using System;

namespace AutoInterfaceAttributes;

/// <summary>
/// Generates an interface for the decorated class/struct.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("AutoInterface", "2.4.0")]
internal sealed class AutoInterfaceAttribute : Attribute {
    /// <summary>
    /// <para>The name of the generated interface.</para>
    /// <para>Default is "I{ClassName}"</para>
    /// </summary>
    public string Name { get; init; }

    /// <summary>
    /// <para>The modifier(s) for the interface.</para>
    /// <para>Deault is "public partial"</para>
    /// </summary>
    public string Modifier { get; init; }

    /// <summary>
    /// <para>The namespace declaration for the interface.</para>
    /// <para>If empty string, no namespace directive will be used (global namespace).<br />
    /// Default (if not present) it will be mapped to the same namespace as the namespace of the class/struct.</para>
    /// </summary>
    public string Namespace { get; init; }

    /// <summary>
    /// <para>interface inheritance: Name(s) of interfaces this interface will inherit.</para>
    /// <para>Default is Array.Empty</para>
    /// </summary>
    public Type[] Inheritance { get; init; }

    /// <summary>
    /// <para>
    /// The Classes, structs or interfaces containing the generated interface.<br />
    /// e.g. ["public sealed partial class Example"] will wrap the interface with that expression.
    /// </para>
    /// <para>Default is Array.Empty</para>
    /// </summary>
    public string[] Nested { get; init; }

    /// <summary>
    /// <para>If enabled, static members get accepted and are generating "static abstract" members.</para>
    /// <para>Default is false</para>
    /// </summary>
    public bool StaticMembers { get; init; }
}

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !AUTOINTERFACE_EXCLUDE_ATTRIBUTES

using System;

namespace AutoInterfaceAttributes;

/// <summary>
/// Adds a "internal" access modifier to the interface member.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Event)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("AutoInterface", "2.4.0")]
internal sealed class AutoInterfaceVisibilityInternal : Attribute { }

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !AUTOINTERFACE_EXCLUDE_ATTRIBUTES

using System;

namespace AutoInterfaceAttributes;

/// <summary>
/// Adds a "private protected" access modifier to the interface member.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Event)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("AutoInterface", "2.4.0")]
internal sealed class AutoInterfaceVisibilityPrivateProtected : Attribute { }

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !AUTOINTERFACE_EXCLUDE_ATTRIBUTES

using System;

namespace AutoInterfaceAttributes;

/// <summary>
/// Adds a "protected" access modifier to the interface member.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Event)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("AutoInterface", "2.4.0")]
internal sealed class AutoInterfaceVisibilityProtected : Attribute { }

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !AUTOINTERFACE_EXCLUDE_ATTRIBUTES

using System;

namespace AutoInterfaceAttributes;

/// <summary>
/// Adds a "protected internal" access modifier to the interface member.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Event)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("AutoInterface", "2.4.0")]
internal sealed class AutoInterfaceVisibilityProtectedInternal : Attribute { }

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !AUTOINTERFACE_EXCLUDE_ATTRIBUTES

using System;

namespace AutoInterfaceAttributes;

/// <summary>
/// Adds a "public" access modifier to the interface member.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Event)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("AutoInterface", "2.4.0")]
internal sealed class AutoInterfaceVisibilityPublic : Attribute { }

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


using AutoInterfaceAttributes;

namespace NullInterface;

public partial interface IDepartment {
    string Name { get; set; }
}

// <auto-generated/>
#pragma warning disable
#nullable enable annotations




namespace NullInterface;

public partial interface IDepartment {
    string Name { get; set; }
}

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


using AutoInterfaceAttributes;

namespace NullInterface;

public partial interface IEmployee {
    string FirstName { get; set; }

    string LastName { get; set; }

    IDepartment Department { get; set; }

    string GetFullName();

    string GetFullNameAndDepartment(string separator);
}

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !AUTOINTERFACE_EXCLUDE_ATTRIBUTES

using System;

namespace AutoInterfaceAttributes;

/// <summary>
/// The decorated member will be Ignored by the generator.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Event)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("AutoInterface", "2.4.0")]
internal sealed class IgnoreAutoInterfaceAttribute : Attribute { }

#endif

Code and pdf at

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


Posted

in

, ,

by

Tags: