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}"), |
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
/// <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
private static void EnsureAdminPrivileges() | |
{ | |
if (new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) | |
{ | |
return; | |
} | |
ProcessStartInfo processInfo = new(Environment.ProcessPath.NotNull()) | |
{ | |
UseShellExecute = true, | |
Verb = "runas" |
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 async Task WithTimeout(this Task task, TimeSpan timeout) | |
{ | |
CancellationTokenSource cts = new(); | |
if (task == await Task.WhenAny(task, Task.Delay(timeout, cts.Token))) | |
{ | |
cts.Cancel(); | |
} | |
else | |
{ | |
throw new TimeoutException(); |
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
<TextBlock> | |
<TextBlock.Text> | |
<MultiBinding StringFormat="{}{0:F0}x{1:F0}"> | |
<Binding ElementName="window" Path="ActualWidth" /> | |
<Binding ElementName="window" Path="ActualHeight" /> | |
</MultiBinding> | |
</TextBlock.Text> | |
</TextBlock> |
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 void EreaseSelection(this ICollectionView collectionView) => collectionView.MoveCurrentToPosition(-1); |
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
using System.Globalization; | |
using System.Windows.Data; | |
/// <summary>A converter based on equality comparisons between the value and the parameter.</summary> | |
public sealed class EqualsConverter : IValueConverter | |
{ | |
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) | |
=> Equals(value, parameter); | |
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) |
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 sealed class Ref<T> | |
{ | |
public Ref(T value) => Value = value; | |
public T Value { get; set; } | |
public static implicit operator T(Ref<T> @ref) => @ref.Value; | |
} |
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 IEnumerable<T> FindVisualChildren<T>(this DependencyObject depObj) where T : DependencyObject | |
{ | |
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) | |
{ | |
var child = VisualTreeHelper.GetChild(depObj, i); | |
if (child is T t) | |
{ | |
yield return t; | |
} | |
foreach (T childOfChild in FindVisualChildren<T>(child)) |
NewerOlder