Enhanced.GetTypes 1.0.0

dotnet add package Enhanced.GetTypes --version 1.0.0                
NuGet\Install-Package Enhanced.GetTypes -Version 1.0.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Enhanced.GetTypes" Version="1.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Enhanced.GetTypes --version 1.0.0                
#r "nuget: Enhanced.GetTypes, 1.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Enhanced.GetTypes as a Cake Addin
#addin nuget:?package=Enhanced.GetTypes&version=1.0.0

// Install Enhanced.GetTypes as a Cake Tool
#tool nuget:?package=Enhanced.GetTypes&version=1.0.0                

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.
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.0 132 8/30/2024