متدهای الحاقی به شما امکان میدهند بدون ایجاد یک نوع مشتقشدهی جدید، کامپایل مجدد، یا تغییر نوع اصلی به شکل دیگری، به انواع موجود متد اضافه کنید. این متدها بهصورت متدهای ایستا تعریف میشوند، اما فراخوانی آنها با نحوهی نگارش فراخوانی متد نمونه انجام میشود. پیش از پارامتر اول آنها اصلاحکنندهی this میآید؛ این پارامتر مشخص میکند که متد روی کدام نوع عمل میکند. این متدها در سطح فضای نام در دسترس قرار میگیرند.
public static int WordCount(this string str)
{
return str.Split().Length;
}
"Hello World".WordCount();
// => 2
در این تمرین، خطوط لاگ را پردازش میکنید.
هر خط لاگ رشتهای است که به این شکل قالببندی شده است: "[<LEVEL>]: <MESSAGE>".
سه سطح مختلف لاگ وجود دارد:
INFOWARNINGERRORچند وظیفه دارید که هر کدام یک خط لاگ میگیرد و از شما میخواهد کاری با آن انجام دهید.
با نگاهی به لاگهای ماه گذشته میبینید که پیام تست همیشه بعد از یک زیررشتهی مشخص قرار دارد. چون پیشبینی میکنید که در آیندهی نزدیک لازم شود پیام تست را استخراج کنید، تصمیم میگیرید یک متد کمکی بسازید که در این کار به شما کمک کند.
متد الحاقی LogAnalysis.SubstringAfter() (بهصورت static) را پیادهسازی کنید که یک جداکنندهی رشتهای میگیرد و زیررشتهی بعد از جداکننده را برمیگرداند.
var log = "[INFO]: File Deleted.";
log.SubstringAfter(": "); // => returns "File Deleted."
با بررسی بیشتر میبینید که سطح لاگ همیشه بین کروشهها ([ و ]) قرار دارد. چون همچنین پیشبینی میکنید که در آیندهی نزدیک لازم شود سطح لاگ را استخراج کنید، تصمیم میگیرید متد کمکی دیگری بسازید که در این کار به شما کمک کند.
متد الحاقی LogAnalysis.SubstringBetween() (بهصورت static) را پیادهسازی کنید که دو جداکنندهی رشتهای میگیرد و زیررشتهای را برمیگرداند که بین آن دو جداکننده قرار دارد.
var log = "[INFO]: File Deleted.";
log.SubstringBetween("[", "]"); // => returns "INFO"
متد الحاقی LogAnalysis.Message() (بهصورت static) را پیادهسازی کنید تا پیام موجود در یک لاگ را برگرداند.
var log = "[ERROR]: Missing ; on line 20.";
log.Message(); // => returns "Missing ; on line 20."
متد الحاقی LogAnalysis.LogLevel() (بهصورت static) را پیادهسازی کنید تا سطح لاگ یک لاگ را برگرداند.
var log = "[ERROR]: Missing ; on line 20.";
log.LogLevel(); // => returns "ERROR"