نظرات مطالب
C# 7 - Pattern matching and switch expressions
C# 7.1 - Pattern-Matching with Generics

C# 7.1 پشتیبانی بهتری از pattern-matching را جهت کار با Generics ارائه داده‌است.
public class Car {}
public class SportsCar : Car
{
   public string Color { get; set; }
}
در اینجا یک کلاس پایه خودرو و سپس یک کلاس مشتق شده‌ی خودرو‌های ورزشی را داریم. اکنون در جائی از برنامه می‌خواهیم متد راندن این خودروها را تعریف کنیم:
public static void Run<T>(T car) where T : Car
{
   if (car is SportsCar sportsCar)
   {
   }

   switch (car)
   {
      case SportsCar sCar:
      break;
   }
}
در اینجا نوع خودرو به صورت جنریک تعریف شده‌است و سپس با استفاده از قابلیت‌های pattern-matching سعی در انطباق با آن‌ها را داریم. کامپایل این قطعه کد در C# 7.0 با خطای کامپایلر ذیل متوقف می‌شود:
 An expression of type "T" cannot be handled by a pattern of type "SportsCar"

اگر این قطعه کد را بخواهیم با C# 7.0 کامپایل کنیم نیاز است ابتدا شیء دریافتی به object تبدیل شود و سپس کار pattern-matching با موفقیت صورت خواهد گرفت:
public static void Run<T>(T car) where T : Car
{
   if ((object)car is SportsCar sportsCar)
   {
   }

   switch ((object)car)
   {
      case SportsCar sCar:
      break;
   }
}
این محدودیت در C# 7.1 برطرف شده‌است و دیگر نیازی به این cast اضافه نیست و می‌توان (object) را از قطعه کد فوق حذف کرد.
بازخوردهای پروژه‌ها
مشکل در فوتر
با سلام و احترام
من از فوتر سفارشی استفاده کردم که مطلبی رو در هر صفحه نمایش داده شود
اما مشکل به این صورت است که در صفحه اول فوتر و جدول اصلی روی هم قرار میگیره اما در بقیه صفحات این مشکل وجود نداره آیا در استفاده من ایرادی وجود داره؟

        public void PageFinished(PdfWriter writer, Document document, IList<SummaryCellData> columnCellsSummaryData)
        {
            var pageSize = document.PageSize;
            var text = "صفحه " + writer.PageNumber + " از ";
            var textLen = _font.BaseFont.GetWidthPoint(text, _font.Size) + 17;
            var positionX = pageSize.Right - 10;
            var align = _direction == PdfRunDirection.RightToLeft ? Element.ALIGN_RIGHT : Element.ALIGN_LEFT;
            ColumnText.ShowTextAligned(
                canvas: _pdfContentByte,
                alignment: align,
                phrase: ReportMethod.SetFont(text, 20),
                x: positionX,
                y: pageSize.GetBottom(4),
                rotation: 0,
                runDirection: (int)_direction,
                arabicOptions: 0);
            var x = _direction == PdfRunDirection.RightToLeft ? positionX - textLen : positionX + textLen;
            _pdfContentByte.AddTemplate(_template, x, pageSize.GetBottom(4));
            //--------------------------------------
            if (_Info != null)
            {
                var table = new PdfGrid(1) { RunDirection = (int)_direction, WidthPercentage = 100 };

                string[] msgField = { "مدیر گروه", _Info.Where(sp => sp.ID == _MemberID).FirstOrDefault().InstKindName, _Info.Where(sp => sp.ID == 0).FirstOrDefault().InstKindName, "امور مالی", "معاون پشتیبانی" };
                string[] dataField = { "", _Info.Where(sp => sp.ID == _MemberID).FirstOrDefault().MasterName, _Info.Where(sp => sp.ID == 0).FirstOrDefault().MasterName, "", _Info.Where(sp => sp.ID == 1).FirstOrDefault().MasterName };
                var infoTable = new PdfGrid(msgField.Length) { RunDirection = PdfWriter.RUN_DIRECTION_RTL, WidthPercentage = 100 };
                foreach (var item in msgField)
                {
                    infoTable.AddCell(ReportMethod.SetCell(item, PdfPCell.NO_BORDER, 1, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, true, 20));
                }
                foreach (var item in dataField)
                {
                    infoTable.AddCell(ReportMethod.SetCell(item, PdfPCell.NO_BORDER, 1, PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, true, 20));
                }

                table.AddCell(infoTable);
                table.SetTotalWidth(new[] { pageSize.Width - document.LeftMargin - document.RightMargin });
                table.WriteSelectedRows(
                        rowStart: 0,
                        rowEnd: -1,
                        xPos: document.LeftMargin,
                        yPos: document.BottomMargin - 10,
                        canvas: writer.DirectContent);

            }
        }


اشتراک‌ها
کتابخانه ngx-page-scroll

Animated scrolling functionality for angular written in pure typescript with no additional dependencies  Demo

  • easy-to-use directive: scroll to an element referenced in the href-attribute (href="#mytarget) just by adding pageScrolldirective
  • service usage: trigger scroll animations from your component or when server responds
  • customizable: adjust duration, offset or whether scrolling stops if the user interrupts (read more)
  • use custom easing functions to calculate the scroll position over time
  • works across routes (scrolls to target element as soon as the routing has finished) and in both directions (horizontal/vertical) 
npm install ngx-page-scroll  
کتابخانه ngx-page-scroll
پاسخ به بازخورد‌های پروژه‌ها
مشکل عمل نکردن فونت فارسی
- شما فونت سلکتور رو به صورت یک فیلد استاتیک تعریف کردید. یعنی هربار دارید به انتهای آن فونت‌های جدید را اضافه می‌کنید. عملکرد فونت سلکتور با اولین فونت اضافه شده به آن در صورتی که تعاریف آن حرف در فونت صفر موجود باشد، پایان خواهد یافت. به همین جهت تمام متون شما دارای یک فونت هستند چون کار به سایر فونت‌ها نرسیده است و نخواهد رسید.
روش صحیح تعریف فونت سلکتور با سربار کم به صورت زیر است:
        static FontSelector getFontSelector(string fontFileName, int size, int style, BaseColor color)
        {
            var systemRoot = Environment.GetEnvironmentVariable("SystemRoot");
            var mainPath = Path.Combine(systemRoot, "fonts\\" + fontFileName);
            if (!File.Exists(mainPath))
            {
                throw new FileNotFoundException(mainPath + " not found.");
            }
            if (!FontFactory.IsRegistered(mainPath))
            {
                FontFactory.Register(mainPath);
            }

            var tahomaPath = Path.Combine(systemRoot, "fonts\\tahoma.ttf");
            if (!File.Exists(tahomaPath))
            {
                throw new FileNotFoundException(tahomaPath + " not found.");
            }
            if (!FontFactory.IsRegistered(tahomaPath))
            {
                FontFactory.Register(tahomaPath);
            }

            var fontSelector = new FontSelector();
            fontSelector.AddFont(FontFactory.GetFont(mainPath, BaseFont.IDENTITY_H, true, size, style, color));
            fontSelector.AddFont(FontFactory.GetFont(tahomaPath, BaseFont.IDENTITY_H, true, size, style, color));
            return fontSelector;
        }
- در مورد گروه بندی، نیاز است منبع داده شما موجود باشد و همچنین sort صحیحی باید صورت گرفته باشد. یک نمونه مشابه برای بررسی.