5.6 — 5. Extension Methods
Mục tiêu bài học
- Nắm được ý chính của bài và mối liên hệ với module.
- Áp dụng được kiến thức vào bối cảnh CRM/.NET backend.
- Sẵn sàng chuyển sang bài kế tiếp với nền tảng chắc chắn.
Nội dung bài học
Extension method cho phép "thêm" method vào type hiện có mà không thừa kế.
public static class StringExtensions
{
// Chuyển tên sản phẩm/tên khách thành URL slug
public static string ToSlug(this string input)
{
if (string.IsNullOrWhiteSpace(input)) return string.Empty;
return input.Trim()
.ToLowerInvariant()
.Replace(" ", "-")
.Replace("đ", "d")
// Bỏ ký tự đặc biệt
.Where(c => char.IsLetterOrDigit(c) || c == '-')
.Aggregate(string.Empty, (s, c) => s + c);
}
}
public static class QueryableExtensions
{
// Dùng trong API endpoint: ?page=2&pageSize=20
public static IQueryable<T> ApplyPaging<T>(this IQueryable<T> query, int page, int pageSize)
{
if (page < 1) page = 1;
if (pageSize < 1 || pageSize > 100) pageSize = 20;
return query.Skip((page - 1) * pageSize).Take(pageSize);
}
}
public static class DateTimeExtensions
{
private static readonly HashSet<DayOfWeek> _weekends = [DayOfWeek.Saturday, DayOfWeek.Sunday];
public static bool IsBusinessDay(this DateTime date)
=> !_weekends.Contains(date.DayOfWeek);
public static DateTime NextBusinessDay(this DateTime date)
{
var next = date.AddDays(1);
while (!next.IsBusinessDay()) next = next.AddDays(1);
return next;
}
}
// Sử dụng:
// "Nguyễn Văn A".ToSlug() → "nguyen-van-a"
// DateTime.Today.IsBusinessDay() → true/false
// query.ApplyPaging(page: 2, pageSize: 20)
Bài tập áp dụng
- Tóm tắt bài học bằng ngôn ngữ của bạn.
- Liên hệ nội dung với một tình huống thực tế trong dự án.
- Đề xuất một cải tiến cụ thể sau khi học bài này.
Tự kiểm tra
- Bạn có thể giải thích lại nội dung chính trong 2 phút không?
- Bạn có ví dụ áp dụng thực tế chưa?
- Bạn biết bước tiếp theo cần học/triển khai là gì không?