This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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}"), |
OlderNewer