Added generic Win32Error.ThrowLastErrorIf method

pull/332/head
dahall 2021-04-06 12:44:00 -06:00
parent 20ac23de3c
commit 4dc0871047
1 changed files with 12 additions and 10 deletions

View File

@ -100,20 +100,29 @@ namespace Vanara.PInvoke
[System.Diagnostics.DebuggerStepThrough]
public static void ThrowLastError(string message = null) => GetLastError().ThrowIfFailed(message);
/// <summary>Throws the last error if the predicate delegate returns <see langword="true"/>.</summary>
/// <typeparam name="T"></typeparam>
/// <param name="value">The value to check.</param>
/// <param name="valueIsFailure">The delegate which returns <see langword="true"/> on failure.</param>
/// <param name="message">The message.</param>
/// <returns>The <paramref name="value"/> passed in on success.</returns>
public static T ThrowLastErrorIf<T>(T value, Func<T, bool> valueIsFailure, string message) =>
!valueIsFailure(value) ? value : throw GetLastError().GetException(message);
/// <summary>Throws the last error if the function returns <see langword="false"/>.</summary>
/// <param name="value">The value to check.</param>
/// <param name="message">The message.</param>
public static bool ThrowLastErrorIfFalse(bool value, string message = null) => CheckPredicateOrThrow(value, v => !v, message);
public static bool ThrowLastErrorIfFalse(bool value, string message = null) => ThrowLastErrorIf(value, v => !v, message);
/// <summary>Throws the last error if the value is an invalid handle.</summary>
/// <param name="value">The SafeHandle to check.</param>
/// <param name="message">The message.</param>
public static T ThrowLastErrorIfInvalid<T>(T value, string message = null) where T : SafeHandle => CheckPredicateOrThrow(value, v => v.IsInvalid, message);
public static T ThrowLastErrorIfInvalid<T>(T value, string message = null) where T : SafeHandle => ThrowLastErrorIf(value, v => v.IsInvalid, message);
/// <summary>Throws the last error if the value is a NULL pointer (IntPtr.Zero).</summary>
/// <param name="value">The pointer to check.</param>
/// <param name="message">The message.</param>
public static IntPtr ThrowLastErrorIfNull(IntPtr value, string message = null) => CheckPredicateOrThrow(value, v => v == IntPtr.Zero, message);
public static IntPtr ThrowLastErrorIfNull(IntPtr value, string message = null) => ThrowLastErrorIf(value, v => v == IntPtr.Zero, message);
/// <summary>Throws if the last error failed, unless the error is the specified value.</summary>
/// <param name="exception">The failure code to ignore.</param>
@ -241,13 +250,6 @@ namespace Vanara.PInvoke
ulong IConvertible.ToUInt64(IFormatProvider provider) => ((IConvertible)value).ToUInt64(provider);
private static T CheckPredicateOrThrow<T>(T value, Func<T, bool> failure, string message)
{
if (failure(value))
GetLastError().ThrowIfFailed(message);
return value;
}
[DllImport(Lib.Kernel32, SetLastError = false, EntryPoint = "GetLastError")]
private static extern uint ExtGetLastError();