Performance-Optimized Object Validation

public static class ValidationExtensions
{
    public static bool IsValidEmail(this string email)
    {
        if (string.IsNullOrWhiteSpace(email)) return false;
        
        try
        {
            var addr = new MailAddress(email);
            return addr.Address == email;
        }
        catch
        {
            return false;
        }
    }
    
    public static bool IsValidPhoneNumber(this string phoneNumber)
    {
        if (string.IsNullOrWhiteSpace(phoneNumber)) return false;
        
        // Remove all non-numeric characters
        var cleaned = new string(phoneNumber.Where(char.IsDigit).ToArray());
        
        // Check if it's between 10-15 digits (international standard)
        return cleaned.Length >= 10 && cleaned.Length <= 15;
    }
    
    public static bool IsInRange(this int value, int min, int max)
    {
        return value >= min && value <= max;
    }
    
    public static bool IsInRange(this decimal value, decimal min, decimal max)
    {
        return value >= min && value <= max;
    }
    
    public static ValidationResult ValidateRequired<T>(this T value, string fieldName) where T : class
    {
        return value != null ? 
            ValidationResult.Success : 
            new ValidationResult($"{fieldName} is required");
    }
}

public class ValidationResult
{
    public bool IsValid { get; }
    public string ErrorMessage { get; }
    
    private ValidationResult(bool isValid, string errorMessage = null)
    {
        IsValid = isValid;
        ErrorMessage = errorMessage;
    }
    
    public static ValidationResult Success => new ValidationResult(true);
    public static ValidationResult Failure(string errorMessage) => new ValidationResult(false, errorMessage);
    
    public ValidationResult(string errorMessage) : this(false, errorMessage) { }
}