Skip to main content

Enhanced.GetTypes by duskembayev

NuGet / site data

Nuget GitHub last commit GitHub Repo stars

Details

Info

info

Name: Enhanced.GetTypes

Enhanced.GetTypes is a NuGet package for simplified types retrieval in .NET Core applications. It uses a source generator for explicit types retrieval without reflection.

Author: duskembayev

NuGet: https://www.nuget.org/packages/Enhanced.GetTypes/

You can find more details at https://github.com/duskembayev/Enhanced.GetTypes

Source: https://github.com/duskembayev/Enhanced.GetTypes

Original Readme

note

Enhanced.GetTypes

license nuget

Enhanced.GetTypes is a NuGet package for observing derived types in current assembly in .NET applications without reflection.

Motivation

The main goal of the package is to provide a way to get derived types in the current assembly without using reflection. This approach allows you to get the types at compile time and use them in different scenarios, such as registering them in the DI container, creating factories, etc.

How to install

dotnet add package Enhanced.GetTypes

How to use

Let's say you have an interface IService and you want to get all derived types of this interface in the current assembly. To do this, you need to create a partial class and mark it with the DerivedTypesAttribute attribute.

using System;
using System.Collections.Generic
using Enhanced.GetTypes;

namespace MyProject;

public partial class ProjectTypes
{
[DerivedTypes(typeof(IService))]
public partial IEnumerable<Type> GetServices();
}

The body of the method will be generated by the source generator and will contain a list of all derived types of the IService interface in the current assembly.

// <auto-generated />
namespace MyProject
{
partial class ProjectTypes
{
private partial System.Collections.Generic.IEnumerable<System.Type> GetServices()
{
yield return typeof(MyProject.People.PeopleService);
yield return typeof(MyProject.Pets.PetsService);
yield return typeof(MyProject.Cars.CarsService);
yield break;
}
}
}

Now you can use the generated method to get all derived types of the IService interface for different purposes. For example, registering them in the DI container.

// ...
var serviceDescriptors = ProjectTypes.GetServices()
.Select(type => ServiceDescriptor.Transient(typeof(IService), type);

builder.Services.TryAddEnumerable(serviceDescriptors);

Additionally, you can specify flags for the DerivedTypesAttribute attribute to filter the types you need.

  • IncludeInternal - include internal types.
  • IncludeAbstract - include abstract types.
  • IncludeInterfaces - include interfaces.
// ...
[DerivedTypes(typeof(IService), IncludeInternal = true, IncludeAbstract = true, IncludeInterfaces = true)]
public partial IEnumerable<Type> GetServices();

Important notes

  • The method marked with the DerivedTypesAttribute attribute must return IEnumerable<Type>.
  • Types from referenced assemblies are not included.

About

note

Generating list of PUBLIC classes that implements an interface

How to use

Example (source csproj, source files)

This is the CSharp Project that references Enhanced.GetTypes

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

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

<ItemGroup>
<PackageReference Include="Enhanced.GetTypes" Version="1.0.0" />
</ItemGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>

Generated Files

Those are taken from $(BaseIntermediateOutputPath)\GX

// <auto-generated />
namespace GetTypesForInterface
{
partial class ProjectTypes
{
public static partial System.Collections.Generic.IEnumerable<System.Type> GetIPersonTypes()
{
yield return typeof(GetTypesForInterface.Student);
yield return typeof(GetTypesForInterface.Teacher);
yield break;
}
}
}

Useful

Download Example (.NET C#)

Share Enhanced.GetTypes

https://ignatandrei.github.io/RSCG_Examples/v2/docs/Enhanced.GetTypes

aaa

Category "EnhancementClass" has the following generators:

1 ApparatusAOT

2 AspectGenerator

3 CommonCodeGenerator

4 Comparison

5 DudNet

6 Enhanced.GetTypes

7 FastGenericNew

8 Immutype

9 Ling.Audit

10 Lombok.NET

11 M31.FluentAPI

12 MemberAccessor

13 MemoryPack

14 Meziantou.Polyfill

15 Microsoft.Extensions.Logging

16 Microsoft.Extensions.Options.Generators.OptionsValidatorGenerator

17 Microsoft.Interop.JavaScript.JSImportGenerator

18 OptionToStringGenerator

19 QueryStringGenerator

20 RSCG_Decorator

21 RSCG_UtilityTypes

22 StaticReflection

23 SyncMethodGenerator

24 System.Runtime.InteropServices

25 System.Text.RegularExpressions

26 TelemetryLogging

27 ThisClass

See category

EnhancementClass