Skip to content

Instantly share code, notes, and snippets.

View 5cover's full-sized avatar

Scover 5cover

  • France
  • 19:47 (UTC +02:00)
View GitHub Profile
@5cover
5cover / TypeEventHandler.cs
Last active June 10, 2023 13:29
Type-safe event handler pattern. This pattern reduces the likelihood of an unhandled ``InvalidCastException`` since the ``sender`` argument of event handlers doesn't need to be casted. It also discourages the usage of closures to retrieve the sender with its original type.
/// <typeparam name="TSender">The type of the source of the event.</typeparam>
/// <typeparam name="TEventArgs">The type of event data generated by the event.</typeparam>
/// <remarks>Type-safe variation from <see cref="EventHandler{TEventArgs}"/>.</remarks>
/// <inheritdoc cref="EventHandler{TEventArgs}"/>
[Serializable]
[SuppressMessage("Naming", "CA1711", Justification = "Type-safe event handler pattern")]
public delegate void TypeEventHandler<TSender, TEventArgs>(TSender sender, TEventArgs e);
/// <typeparam name="TSender">The type of the source of the event.</typeparam>
/// <remarks>Type-safe variation from <see cref="EventHandler"/>.</remarks>
@5cover
5cover / Extensions.cs
Created June 10, 2023 14:32
Check if path is in directory.
public static bool IsInDirectory(this FileInfo file, DirectoryInfo directory) => file.Directory?.IsInDirectory(directory) ?? false;
[SuppressMessage("Globalization", "CA1309", Justification = "Path comparison")]
public static bool IsInDirectory(this DirectoryInfo path, DirectoryInfo directory)
=> path.Parent != null && (path.Parent.FullName.Equals(directory.FullName, StringComparison.InvariantCultureIgnoreCase) || path.Parent.IsInDirectory(directory));
@5cover
5cover / functional_visitor_example.cs
Last active April 27, 2024 10:26
C# Visitor pattern compile-time safety example
// This visitor implementation attemps to make the best of both worlds, between C#'s functional features and compile-time safety.
// Using extension methods as visitors makes it a runtime error for there not to be an equivalent visitor for every subclass of the element hierarchy.
// This approach ensures compile-time safety, while minimizing boilerplate. It's a step closer to the ideal of "if it compiles, it works".
using System;
Room room = new Bathroom(10);
RoomVisitor visitorPrintSurface = new(
bathroom => Console.WriteLine($"Surface of bathroom: {bathroom.Surface}"),