Enhanced.GetTypes by duskembayev
Nuget / site data
Details
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
Original Readme
Enhanced.GetTypes
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 returnIEnumerable<Type>
. - Types from referenced assemblies are not included.
About
Generating list of PUBLIC classes that implements an interface
How to use
Example ( source csproj, source files )
- CSharp Project
- Program.cs
- ProjectTypes.cs
- IPerson.cs
- Student.cs
- Teacher.cs
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>
This is the use of Enhanced.GetTypes in Program.cs
// See https://aka.ms/new-console-template for more information
using GetTypesForInterface;
Console.WriteLine("Hello, World!");
foreach (var type in ProjectTypes.GetIPersonTypes())
{
Console.WriteLine(type.Name);
}
This is the use of Enhanced.GetTypes in ProjectTypes.cs
using Enhanced.GetTypes.Annotation;
namespace GetTypesForInterface;
public partial class ProjectTypes
{
[DerivedTypes(typeof(IPerson))]
public static partial IEnumerable<Type> GetIPersonTypes();
}
This is the use of Enhanced.GetTypes in IPerson.cs
namespace GetTypesForInterface;
internal interface IPerson
{
public string Name { get; set; }
}
This is the use of Enhanced.GetTypes in Student.cs
namespace GetTypesForInterface;
public class Student : IPerson
{
public string Name { get; set; } = "";
}
This is the use of Enhanced.GetTypes in Teacher.cs
namespace GetTypesForInterface;
public class Teacher:IPerson
{
public string Name { get; set; } = "";
}
Generated Files
Those are taken from $(BaseIntermediateOutputPath)\GX
- ProjectTypes.GetIPersonTypes.g.cs
// <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;
}
}
}
Usefull
Download Example (.NET C# )
Share Enhanced.GetTypes
https://ignatandrei.github.io/RSCG_Examples/v2/docs/Enhanced.GetTypes