Soenneker.Reflection.Cache
2.1.8
Prefix Reserved
See the version list below for details.
dotnet add package Soenneker.Reflection.Cache --version 2.1.8
NuGet\Install-Package Soenneker.Reflection.Cache -Version 2.1.8
<PackageReference Include="Soenneker.Reflection.Cache" Version="2.1.8" />
paket add Soenneker.Reflection.Cache --version 2.1.8
#r "nuget: Soenneker.Reflection.Cache, 2.1.8"
// Install Soenneker.Reflection.Cache as a Cake Addin #addin nuget:?package=Soenneker.Reflection.Cache&version=2.1.8 // Install Soenneker.Reflection.Cache as a Cake Tool #tool nuget:?package=Soenneker.Reflection.Cache&version=2.1.8
Soenneker.Reflection.Cache
The fastest .NET Reflection cache
Reflection is slow.
- If you're calling some Reflection code once, consider if creating a cache is necessary.
- If you need to call Reflection repeatedly, this library can help speed things up.
This library is attempting to be a drop-in replacement for System.Reflection
and caches the results of Reflection calls (so it's going to allocate more memory). It's thread-safe and supports concurrency.
Installation
dotnet add package Soenneker.Reflection.Cache
This cache can either be added to DI like so:
public void ConfigureServices(IServiceCollection services)
{
services.AddReflectionCacheAsSingleton(); // or AddReflectionCacheAsScoped()
}
and you could access it like:
public class MyService
{
private readonly IReflectionCache _cache;
public MyService(IReflectionCache cache)
{
_cache = cache;
}
}
or you can instantiate it manually:
var cache = new ReflectionCache();
Usage
var type1 = Type.GetType("System.String"); // <-- regular Reflection
var type2 = cache.GetType("System.String"); // <-- cached Reflection
bool areEqual = type1 == type2; // true
Keep in mind:
cache.GetType("System.String"); // <-- as slow as regular Reflection
cache.GetType("System.String"); // <-- very fast because the first call was cached
⚠️ Important ⚠️
Be mindful of the "cache chain". Use the Cached
methods and types until you need to get the final Reflection type you need from the cache.
There are two methods for most operations like this:
Type typeofString = cache.GetType("System.String"); // <-- caches, stops the cache chain
CachedType type = cache.GetCachedType("System.String"); // <-- caches, continues the cache chain
Scenario: Retrieving parameters from a method
✅ Good:
CachedType cachedType = cache.GetCachedType("System.String");
CachedMethod cachedMethodInfo = cachedType.GetCachedMethod("Intern");
ParameterInfo?[] parameters = cachedMethodInfo.GetParameters(); // < -- parameters are now cached
❌ Bad:
CachedType cachedType = cache.GetCachedType("System.String");
MethodInfo methodInfo = cachedType.GetMethod("Intern"); // <-- uh oh, a non-cached Reflection type
ParameterInfo?[] parameters = methodInfo.GetParameters(); // <-- not cached, repeat calls are slow
Notes
- Be thoughtful of your memory footprint and where/when you dispose of the cache.
- A cache removal mechanism is needing to be built yet.
- Many Reflection functionalities are not yet implemented, and could benefit from caching.
- If you see something that could be improved (performance or allocation), please open an issue or PR.
- This library is not yet battle-tested. Please use with caution.
Benchmarks (.NET 8.0)
GetType()
5,772% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetType_string_NoCache | 955.27 ns | 2.216 ns | 2.073 ns | baseline | |
GetType_string_Cache | 16.27 ns | 0.102 ns | 0.091 ns | 58.72x faster | 0.38x |
GetType_string_ThreadSafe_Cache | 23.99 ns | 0.402 ns | 0.376 ns | 39.83x faster | 0.64x |
GetProperties()
8,960% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetProperties_NoCache | 58.5363 ns | 0.3463 ns | 0.3070 ns | baseline | |
GetProperties_Cache | 0.6502 ns | 0.0370 ns | 0.0328 ns | 90.25x faster | 4.59x |
GetProperties_ThreadSafe_Cache | 0.7169 ns | 0.0129 ns | 0.0108 ns | 81.72x faster | 1.36x |
GetMethods()
599% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetMethods_NoCache | 275.22 ns | 1.899 ns | 1.776 ns | baseline | |
GetMethods_Cache | 39.36 ns | 0.694 ns | 0.649 ns | 6.99x faster | 0.13x |
GetCustomAttributes()
1,319% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetAttributes_NoCache | 1,982.84 ns | 14.271 ns | 12.651 ns | baseline | |
GetAttributes_Cache | 14.87 ns | 0.358 ns | 0.351 ns | 132.928x faster | 3.33x |
GetMethod()
37% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetMethod_NoCache | 23.06 ns | 0.234 ns | 0.208 ns | baseline | |
GetMethod_Cache | 16.77 ns | 0.079 ns | 0.070 ns | 1.37x faster | 0.01x |
GetMembers()
71,130% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetMembers_NoCache | 519.4286 ns | 1.7392 ns | 1.5417 ns | baseline | |
GetMembers_Cache | 0.7297 ns | 0.0089 ns | 0.0083 ns | 712.321x faster | 7.66x |
GetProperty()
52% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetProperty_NoCache | 25.71 ns | 0.295 ns | 0.276 ns | baseline | |
GetProperty_Cache | 16.89 ns | 0.171 ns | 0.151 ns | 1.52x faster | 0.03x |
GetGenericTypeDefinition()
420% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
GetGenericTypeDefinition_NoCache | 1.8214 ns | 0.0651 ns | 0.0577 ns | baseline | |
GetGenericTypeDefinition_Cache | 0.3505 ns | 0.0123 ns | 0.0109 ns | 5.20x faster | 0.26x |
IsAssignableFrom()
36% faster
Method | Mean | Error | StdDev | Ratio | RatioSD |
---|---|---|---|---|---|
IsAssignableFrom_NoCache | 11.054 ns | 0.2127 ns | 0.1989 ns | baseline | |
IsAssignableFrom_Cache | 8.133 ns | 0.1196 ns | 0.1119 ns | 1.36x faster | 0.03x |
Notes:
- These are averages over many iterations. The first operation is going to be as slow as the Reflection it sits in front of.
- Outliers have been removed in cases BenchmarkDotnet deems necessary.
Product | Versions 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 | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Soenneker.Reflection.Cache:
Package | Downloads |
---|---|
Soenneker.Cosmos.Serializer
A fast, lightweight JSON (de)serializer for Azure Cosmos DB |
|
Soenneker.Utils.AutoBogus
The .NET Bogus autogenerator |
|
Soenneker.Utils.String
A utility library for useful String operations |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.1.233 | 0 | 11/8/2024 |
2.1.232 | 0 | 11/8/2024 |
2.1.231 | 0 | 11/8/2024 |
2.1.230 | 5,411 | 10/31/2024 |
2.1.229 | 199 | 10/31/2024 |
2.1.228 | 6,096 | 10/29/2024 |
2.1.227 | 11,254 | 10/22/2024 |
2.1.226 | 6,612 | 10/22/2024 |
2.1.225 | 10,636 | 10/14/2024 |
2.1.224 | 5,349 | 10/11/2024 |
2.1.223 | 790 | 10/11/2024 |
2.1.222 | 7,086 | 10/8/2024 |
2.1.221 | 4,703 | 10/8/2024 |
2.1.220 | 74 | 10/8/2024 |
2.1.219 | 8,591 | 10/3/2024 |
2.1.218 | 8,441 | 10/2/2024 |
2.1.217 | 7,023 | 10/1/2024 |
2.1.216 | 6,910 | 9/29/2024 |
2.1.215 | 1,349 | 9/28/2024 |
2.1.214 | 6,123 | 9/27/2024 |
2.1.213 | 81 | 9/27/2024 |
2.1.212 | 243 | 9/27/2024 |
2.1.211 | 85 | 9/27/2024 |
2.1.210 | 89 | 9/27/2024 |
2.1.209 | 76 | 9/27/2024 |
2.1.208 | 80 | 9/27/2024 |
2.1.207 | 3,088 | 9/27/2024 |
2.1.206 | 8,277 | 9/26/2024 |
2.1.205 | 1,421 | 9/26/2024 |
2.1.204 | 7,158 | 9/25/2024 |
2.1.203 | 5,622 | 9/23/2024 |
2.1.202 | 4,857 | 9/23/2024 |
2.1.201 | 3,739 | 9/23/2024 |
2.1.200 | 83 | 9/23/2024 |
2.1.199 | 785 | 9/23/2024 |
2.1.198 | 78 | 9/23/2024 |
2.1.197 | 529 | 9/22/2024 |
2.1.196 | 87 | 9/22/2024 |
2.1.195 | 9,938 | 9/17/2024 |
2.1.194 | 567 | 9/17/2024 |
2.1.193 | 135 | 9/17/2024 |
2.1.192 | 81 | 9/17/2024 |
2.1.191 | 93 | 9/17/2024 |
2.1.190 | 85 | 9/17/2024 |
2.1.189 | 95 | 9/17/2024 |
2.1.188 | 24,761 | 9/11/2024 |
2.1.187 | 3,615 | 9/11/2024 |
2.1.186 | 9,001 | 9/10/2024 |
2.1.185 | 1,587 | 9/9/2024 |
2.1.184 | 3,118 | 9/9/2024 |
2.1.183 | 6,455 | 9/9/2024 |
2.1.182 | 8,295 | 9/6/2024 |
2.1.181 | 4,615 | 9/5/2024 |
2.1.180 | 2,068 | 9/5/2024 |
2.1.179 | 2,443 | 9/5/2024 |
2.1.178 | 92 | 9/5/2024 |
2.1.177 | 1,026 | 9/5/2024 |
2.1.176 | 94 | 9/5/2024 |
2.1.175 | 97 | 9/5/2024 |
2.1.174 | 7,985 | 9/4/2024 |
2.1.173 | 8,379 | 9/3/2024 |
2.1.172 | 3,013 | 9/3/2024 |
2.1.171 | 14,606 | 8/21/2024 |
2.1.170 | 1,539 | 8/20/2024 |
2.1.169 | 286 | 8/20/2024 |
2.1.168 | 112 | 8/20/2024 |
2.1.167 | 115 | 8/20/2024 |
2.1.166 | 2,532 | 8/20/2024 |
2.1.165 | 110 | 8/20/2024 |
2.1.164 | 104 | 8/20/2024 |
2.1.163 | 7,655 | 8/19/2024 |
2.1.162 | 8,088 | 8/13/2024 |
2.1.161 | 9,472 | 8/6/2024 |
2.1.160 | 6,151 | 8/1/2024 |
2.1.159 | 3,553 | 7/31/2024 |
2.1.158 | 6,314 | 7/25/2024 |
2.1.157 | 57 | 7/25/2024 |
2.1.156 | 2,164 | 7/24/2024 |
2.1.155 | 15,900 | 7/14/2024 |
2.1.154 | 7,620 | 7/10/2024 |
2.1.153 | 3,713 | 7/10/2024 |
2.1.151 | 1,624 | 7/9/2024 |
2.1.149 | 138 | 7/9/2024 |
2.1.148 | 6,105 | 7/9/2024 |
2.1.147 | 3,724 | 7/9/2024 |
2.1.146 | 90 | 7/9/2024 |
2.1.145 | 1,563 | 7/9/2024 |
2.1.144 | 91 | 7/9/2024 |
2.1.143 | 3,411 | 7/9/2024 |
2.1.141 | 597 | 7/8/2024 |
2.1.140 | 83 | 7/8/2024 |
2.1.139 | 85 | 7/8/2024 |
2.1.138 | 1,716 | 7/8/2024 |
2.1.137 | 8,381 | 7/7/2024 |
2.1.136 | 1,028 | 7/7/2024 |
2.1.135 | 12,088 | 7/3/2024 |
2.1.134 | 13,830 | 6/15/2024 |
2.1.133 | 10,387 | 6/1/2024 |
2.1.132 | 74 | 6/1/2024 |
2.1.131 | 608 | 6/1/2024 |
2.1.130 | 5,583 | 5/31/2024 |
2.1.129 | 3,228 | 5/29/2024 |
2.1.128 | 3,689 | 5/28/2024 |
2.1.127 | 2,373 | 5/27/2024 |
2.1.126 | 6,867 | 5/25/2024 |
2.1.125 | 1,850 | 5/25/2024 |
2.1.124 | 146 | 5/25/2024 |
2.1.123 | 102 | 5/25/2024 |
2.1.122 | 1,641 | 5/25/2024 |
2.1.121 | 108 | 5/25/2024 |
2.1.120 | 103 | 5/25/2024 |
2.1.119 | 108 | 5/25/2024 |
2.1.118 | 101 | 5/25/2024 |
2.1.117 | 17,383 | 5/23/2024 |
2.1.116 | 1,894 | 5/22/2024 |
2.1.115 | 1,489 | 5/22/2024 |
2.1.114 | 103 | 5/22/2024 |
2.1.113 | 105 | 5/22/2024 |
2.1.112 | 217 | 5/22/2024 |
2.1.111 | 3,739 | 5/22/2024 |
2.1.110 | 6,566 | 5/17/2024 |
2.1.109 | 6,853 | 5/14/2024 |
2.1.108 | 75 | 5/14/2024 |
2.1.107 | 13,552 | 4/29/2024 |
2.1.106 | 138 | 4/29/2024 |
2.1.105 | 3,766 | 4/28/2024 |
2.1.104 | 2,390 | 4/28/2024 |
2.1.103 | 101 | 4/28/2024 |
2.1.102 | 2,876 | 4/28/2024 |
2.1.101 | 102 | 4/28/2024 |
2.1.100 | 1,664 | 4/28/2024 |
2.1.99 | 104 | 4/28/2024 |
2.1.98 | 99 | 4/28/2024 |
2.1.97 | 103 | 4/28/2024 |
2.1.96 | 627 | 4/27/2024 |
2.1.95 | 103 | 4/27/2024 |
2.1.94 | 1,350 | 4/27/2024 |
2.1.93 | 12,709 | 4/12/2024 |
2.1.92 | 3,197 | 4/12/2024 |
2.1.91 | 108 | 4/12/2024 |
2.1.90 | 121 | 4/12/2024 |
2.1.89 | 150 | 4/12/2024 |
2.1.88 | 166 | 4/12/2024 |
2.1.87 | 113 | 4/12/2024 |
2.1.86 | 2,397 | 4/12/2024 |
2.1.85 | 126 | 4/12/2024 |
2.1.84 | 7,731 | 4/9/2024 |
2.1.83 | 3,766 | 4/1/2024 |
2.1.82 | 7,183 | 3/25/2024 |
2.1.81 | 4,153 | 3/19/2024 |
2.1.80 | 6,156 | 3/13/2024 |
2.1.79 | 115 | 3/13/2024 |
2.1.78 | 997 | 3/13/2024 |
2.1.77 | 113 | 3/13/2024 |
2.1.76 | 110 | 3/13/2024 |
2.1.75 | 2,874 | 3/12/2024 |
2.1.74 | 115 | 3/12/2024 |
2.1.73 | 7,869 | 3/8/2024 |
2.1.72 | 3,769 | 3/6/2024 |
2.1.71 | 2,043 | 3/4/2024 |
2.1.70 | 3,801 | 3/2/2024 |
2.1.69 | 1,601 | 3/2/2024 |
2.1.68 | 2,534 | 2/29/2024 |
2.1.67 | 4,742 | 2/25/2024 |
2.1.66 | 4,060 | 2/22/2024 |
2.1.65 | 2,139 | 2/21/2024 |
2.1.64 | 643 | 2/21/2024 |
2.1.63 | 1,363 | 2/21/2024 |
2.1.62 | 107 | 2/21/2024 |
2.1.61 | 121 | 2/21/2024 |
2.1.60 | 111 | 2/21/2024 |
2.1.59 | 115 | 2/21/2024 |
2.1.58 | 1,172 | 2/20/2024 |
2.1.57 | 3,197 | 2/20/2024 |
2.1.56 | 2,760 | 2/19/2024 |
2.1.55 | 117 | 2/19/2024 |
2.1.54 | 106 | 2/19/2024 |
2.1.53 | 122 | 2/18/2024 |
2.1.52 | 4,079 | 2/16/2024 |
2.1.51 | 115 | 2/16/2024 |
2.1.50 | 787 | 2/16/2024 |
2.1.49 | 1,271 | 2/16/2024 |
2.1.48 | 812 | 2/16/2024 |
2.1.47 | 1,524 | 2/16/2024 |
2.1.46 | 2,171 | 2/13/2024 |
2.1.45 | 2,169 | 2/13/2024 |
2.1.44 | 116 | 2/13/2024 |
2.1.43 | 117 | 2/13/2024 |
2.1.42 | 3,222 | 2/11/2024 |
2.1.41 | 2,301 | 2/11/2024 |
2.1.40 | 1,205 | 2/10/2024 |
2.1.39 | 116 | 2/10/2024 |
2.1.38 | 108 | 2/10/2024 |
2.1.37 | 148 | 2/9/2024 |
2.1.36 | 2,476 | 2/9/2024 |
2.1.35 | 1,545 | 2/9/2024 |
2.1.34 | 114 | 2/9/2024 |
2.1.33 | 1,451 | 2/8/2024 |
2.1.32 | 1,214 | 2/8/2024 |
2.1.31 | 1,162 | 2/8/2024 |
2.1.30 | 2,883 | 2/6/2024 |
2.1.29 | 1,118 | 2/6/2024 |
2.1.28 | 108 | 2/6/2024 |
2.1.27 | 2,263 | 2/6/2024 |
2.1.26 | 116 | 2/6/2024 |
2.1.25 | 167 | 2/5/2024 |
2.1.24 | 2,921 | 2/4/2024 |
2.1.23 | 109 | 2/4/2024 |
2.1.22 | 1,313 | 2/2/2024 |
2.1.21 | 94 | 2/1/2024 |
2.1.20 | 115 | 2/1/2024 |
2.1.19 | 137 | 2/1/2024 |
2.1.18 | 109 | 1/31/2024 |
2.1.17 | 101 | 1/31/2024 |
2.1.16 | 1,733 | 1/30/2024 |
2.1.15 | 4,058 | 1/28/2024 |
2.1.14 | 7,654 | 1/27/2024 |
2.1.13 | 856 | 1/26/2024 |
2.1.12 | 5,975 | 1/25/2024 |
2.1.11 | 106 | 1/25/2024 |
2.1.10 | 103 | 1/25/2024 |
2.1.9 | 109 | 1/25/2024 |
2.1.8 | 103 | 1/25/2024 |
2.1.7 | 2,279 | 1/23/2024 |
2.1.6 | 111 | 1/21/2024 |