private static T TryGetActual <T>(ICanAddMatcher <T> matcher) { if (matcher == null) { throw new InvalidOperationException( $"Can't get an Actual value from a NULL matcher" ); } var prop = matcher?.GetType() .GetProperties() .FirstOrDefault(pi => pi.Name.ToLower() == "actual"); if (prop == null) { throw new InvalidOperationException( $"Failed to GetActual on type {typeof(T)}. GetActual only works on IHasActual<T> or objects with an 'Actual' property"); } try { return((T)prop.GetValue(matcher)); } catch { throw new InvalidOperationException( @$ "Unable to get Actual value matching type { typeof(T) } from { matcher.Stringify() }"