اگر قبلاً با متد Contains کارکرده باشید میدانید که یک string از شما بهعنوان پارامتر ورودی دریافت میکند و سپس رشته موردنظرتان را بررسی میکند که این در آن موجود است یا خیر. حال اگر نیاز به بررسی آرایه در یک رشته را داشته باشیم باید چه کنیم؟ چاره کار استفاده از اکستنشن متد است.
بررسی آرایه در یک رشته با اکستنشن متد ContainsAny
فرض کنید سناریو ما اینچنین است که قرار به آپلود فایلی هستیم و نیاز است قبل از بارگذاری آن در سرور چک کنیم که آیا پسوند آن از نظر ما مجاز است یا خیر. در این صورت نیاز است که ابتدا پسوندهای مجاز را در تابع ContainsAny معرفی کنیم. همانطور که گفته شد این تابع بهصورت پیشفرض در متدهای دات نت نیست و ما خودمان آن را ابتدا بهصورت دستی میسازیم.
- ابتدا ایمپورت های لازم را فراخوانی میکنیم.
- سپس یک ماژول ایجاد میکنیم.
- اگر از زبان سی شارپ استفاده میکنید باید یک class ایجاد کنید.
Imports Microsoft.VisualBasic Imports System.Runtime.CompilerServices Imports System.Globalization Imports System.Dynamic Imports System.IO Imports System.Drawing Imports System.Drawing.Imaging Public Module myExtention
ساخت اکستنشن متد
- ابتدا تگ Extension را بالای فانکشن اضافه میکنیم تا در هنگام کد نویسی بهصورت متد inline ظاهر گردد.
- پارامترهای داخل فانکشن یکی از نوع String است و دیگری آرایهای از string ها.
- سپس یک حلقه تشکیل داده و تکبهتک عناصر را مورد آزمایش قرار میدهد.
- به محض آنکه یکی از مقادیر جواب True به ما بدهد از حلقه خارج میشود.
- اما درصورتیکه اتفاق نیفتد مقدار بازگشتی False است.
<Extension()> Public Function ContainsAny(ByVal haystack As String, ParamArray needles As String()) As Boolean For Each i In needles If i.Contains(haystack) Then Return True End If Next Return False End Function
کاربرد اکستنشن متد
حال به مثال زیر توجه کنید. در این مثال که مربوط به آپلود فایل است ایتدا پسوند فایل مورد شناسایی قرار گرفته و سپس با همین متد بررسی شده که ایا این پسوند از نظر ما مجاز به انتقال به سرور است یا خیر. سپس در ادامه محدودیت حجم آپلود را بر حسب MB بررسی شده و در اخر با دادن مسیر نهایی آپلود فایل محل ذخیره نهایی آن مشخص شده است.
<HttpPost> <ValidateAntiForgeryToken> Function myupload(files As IEnumerable(Of HttpPostedFileBase)) As ActionResult Try If (Not (files) Is Nothing) Then For Each u In files ' Verify that the user selected a file If ((Not u Is Nothing) _ AndAlso (u.ContentLength > 0)) Then '۱- Get and Check File Extention If Path.GetExtension(u.FileName). ContainsAny(".jpeg", ".jpg", ".png", ".gif", ".mp4", ".mp3", ".wma", ".wav", ".۷z", ".zip", ".rar", ".csv", ".xlsx", ".xls", ".doc", ".docx", ".txt", ".pdf", ".pptx") = False Then Return msgR.Noty("پسوند فایل غیر قابل قبول است.", "success", "bottom right") Exit For Exit Function ElseIf (u.ContentLength / 1024 / 1024) > 512 Then Return msgR.Noty("حداکثر حجم فایل ۵۱۲ MB است.", "success", "bottom right") Exit For Exit Function End If ' extract only the fielname Dim fileName = Path.GetFileName(u.FileName) '۵- Check File Exist And if (True) Generate new name While (System.IO.File.Exists(Server.MapPath(current_path) & "\\" & fileName)) fileName = Path.GetFileNameWithoutExtension(u.FileName) + "_" + Date.Now.Second.ToString + Path.GetExtension(u.FileName) End While ' TODO: need to define destination Dim pathh = Server.MapPath(current_path) + "\" + fileName u.SaveAs(pathh) End If Next End If Catch ex As Exception End Try Return msgR.Noty("اپلود انجام شد", "success", "bottom right") End Function