| |

C# How to update a readonly field using UnsafeAccessor

Unsafe accessors can be used to access private members of a class, just like you would with reflection. And the same can be said about changing the value of a readonly field. Let’s assume the following class: Let’s say that for some reason you want to change the value of that read-only field. You could…

Benchmark results comparing UnsafeAccessor to reflection and direct access. Results show zero overhead for UnsafeAccessor compared to direct access, both clocking in at aroun 0ns, while reflection access takes around 36 ns, or 21 ns when the method info is cached.
| |

.NET 8 Performance: UnsafeAccessor vs. Reflection

In a previous article we covered how to access private members using UnsafeAccessor. This time around, we want to look at it’s performance compared to Reflection, and to see whether it’s truly zero-overhead or not. We’re going to do four benchmarks. If you want to run the benchmarks yourself, you have the code below: Benchmark…

Usage example of Experimental attribute introduced in C# 12.
| |

C# – How to mark features as experimental

Starting with C# 12, a new ExperimentalAttribute is introduced allowing you to mark types, methods, properties or assemblies as being experimental features. This will trigger a compiler warning during usage which can be disabled using a #pragma tag. The Experimental attribute requires a diagnosticId parameter to be passed in the constructor. That diagnostic ID will…

C# – What is a NullReferenceException, and how to fix it?

A NullReferenceException is a common runtime error which occurs when your code tries to access or manipulate an object or a member of an object, but the object reference is currently set to null (meaning it doesn’t reference any valid object in memory). In other words, you’re trying to perform an operation on something that…

|

Implementation type Data.AppDbContext can’t be converted to service type Microsoft.AspNetCore.Identity.IUserStore

This exception is thrown when you are building an identity DbContext without providing the user and role stores using AddUserStore and AddRoleStore. You can provide both configurations with a single call to AddEntityFrameworkStores like in the example below: The full exception for reference: System.AggregateException: ‘Some services are not able to be constructed (Error while validating…

| |

NET 8 – Serializing properties from interface hierarchies

.NET 8 adds support for serializing properties from interface hierarchies. This means that all the properties from all interfaces in the hierarchy will be included in the serialization. The most important thing is where you start. Let’s take the following hierarchy as an example: Now, during serialization, if you pass along a Derived2Impl instance stored…

| |

NET 8 – Deserialize into non-public properties

Similar to serializing into non-public members, you can deserialize into non-public members by providing a constructor with parameters matching the non-public member names and by annotating the non-public members with the JsonInclude attribute. Let’s jump straight to an example: Note how we haven’t annotated PublicProperty in any way and we haven’t included it in the…

| |

NET 8 – How to use JsonStringEnumConverter with native AOT

JsonStringEnumConverter is not compatible with native AOT. To fix that, NET 8 introduces a new converter type JsonStringEnumConverter<TEnum> that is compatible with native AOT. To use the new type, simply annotate your types as follows: Keep in mind: enum deserialization is case insensitive, while serialization can be cusomized via JsonNamingPolicy. What happens if you try…

| |

The type or namespace name InterceptsLocationAttribute could not be found

If you’re just getting started with interceptors, you might be getting one of the following errors: Error CS0246 The type or namespace name ‘InterceptsLocationAttribute’ could not be found (are you missing a using directive or an assembly reference?) Error CS0246 The type or namespace name ‘InterceptsLocation’ could not be found (are you missing a using…

| |

NET 8 – Mark JsonSerializerOptions as readonly

Starting with .NET 8 you can mark JsonSerializerOptions instances as read-only, preventing further changes to the instance. To freeze the instance, simply call MakeReadOnly on the options instance. Let’s take an example: Furthermore, you can check if an instance was frozen or not by checking the IsReadOnly property. Attempting to modify a JsonSerializerOptions instance after…