TypeNameFormatter.Sources
1.0.0-beta
See the version list below for details.
Requires NuGet 2.8 or higher.
dotnet add package TypeNameFormatter.Sources --version 1.0.0-beta
NuGet\Install-Package TypeNameFormatter.Sources -Version 1.0.0-beta
<PackageReference Include="TypeNameFormatter.Sources" Version="1.0.0-beta"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add TypeNameFormatter.Sources --version 1.0.0-beta
#r "nuget: TypeNameFormatter.Sources, 1.0.0-beta"
// Install TypeNameFormatter.Sources as a Cake Addin #addin nuget:?package=TypeNameFormatter.Sources&version=1.0.0-beta&prerelease // Install TypeNameFormatter.Sources as a Cake Tool #tool nuget:?package=TypeNameFormatter.Sources&version=1.0.0-beta&prerelease
TypeNameFormatter is a small .NET library for formatting type names à la C#.
What is this good for?
Have you ever stumbled over the cryptic formatting of Type
objects?
var someType = typeof(IEnumerable<int[]>);
Console.WriteLine(someType);
// => System.Collections.Generic.IEnumerable`1[System.Int32[]]
If you'd rather see something that looks more like a C# type name, then this library might be for you:
using TypeNameFormatter;
var someType = typeof(IEnumerable<int[]>);
Console.WriteLine(someType.GetFormattedName());
// => IEnumerable<int[]>
Formatting any Type
involves more special cases than you might expect (such as generic types, nested types, multi-dimensional and jagged arrays, by-reference and pointer types). This library deals with all of those, so that you don't have to.
How do I use it?
By importing the TypeNameFormatter
namespace, the following extension methods become available:
stringBuilder.AppendFormattedName(Type type, [TypeNameFormatOptions options])
:
Appends a C#-formatted type name to the givenStringBuilder
.type.GetFormattedName([TypeNameFormatOptions options])
:
Returns a C#-formatted type name as a string. (This is a convenience method that does exactly the same as the above, using a throw-awayStringBuilder
.)
Both methods allow you to specify any combination of the following TypeNameFormatOptions
flags:
GenericParameterNames
:
Parameter names of an open generic type should be included. (For example,IEnumerable˂T˃
instead ofIEnumerable˂˃
. Note that this setting does not affect closed generic types; their arguments are always included.)Namespaces
:
Namespaces should be included. (For example,System.Action
instead ofAction
.)NoKeywords
:
Primitive types should not be mapped to their corresponding C# language keywords. (For example,Int32
instead ofint
.)NoNullableQuestionMark
: Nullable types should not be formatted using C# question mark syntax. (For example,Nullable˂int˃
instead ofint?
.)
But it doesn't format <some type> correctly!
If you think you've found a bug, please raise an issue so it can be looked into. (Make sure to mention the type that doesn't get formatted as expected.)
Alternatives
If you're targeting the .NET Framework, you can use good old
System.CodeDom
(which isn't particularly fast, however):using Microsoft.CSharp; using System.CodeDom; static string GetFormattedName(this Type type) { using (var provider = new CSharpCodeProvider()) { var typeReference = new CodeTypeReference(type); return provider.GetTypeOutput(typeReference); } }
You could perhaps use Microsoft's .NET Compiler Platform (Roslyn), but that is a large library that can do much more than is needed.
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories (4)
Showing the top 4 popular GitHub repositories that depend on TypeNameFormatter.Sources:
Repository | Stars |
---|---|
devlooped/moq
The most popular and friendly mocking framework for .NET
|
|
moq/labs
The most popular and friendly mocking framework for .NET
|
|
lindexi/lindexi_gd
博客用到的代码
|
|
devlooped/avatar
A modern compile-time generated interception/proxy library
|
Version | Downloads | Last updated |
---|---|---|
1.1.1 | 370,324 | 1/16/2021 |
1.1.0 | 1,992 | 11/12/2020 |
1.0.1 | 6,325 | 12/30/2018 |
1.0.0 | 10,231 | 7/11/2018 |
1.0.0-beta3 | 2,239 | 6/7/2018 |
1.0.0-beta | 2,146 | 5/24/2018 |
1.0.0-alpha | 2,497 | 5/24/2018 |