How to create own dynamic type or dynamic object in C#

How to create own dynamic type or dynamic object in C#

using System.Reflection;
using System.Reflection.Emit;
public static class MyTypeBuilder
    {
        
        public static System.Collections.IList CreateInstanceIList(Type _type)
        {
            Type customList = typeof(List<>).MakeGenericType(_type);
            var result = (System.Collections.IList)Activator.CreateInstance(customList);
            return result;
        }
        public static Type CompileResultType(Dictionary<string, Type> listOfFields)
        {
            TypeBuilder tb = GetTypeBuilder();
            foreach (var field in listOfFields)
                CreateProperty(tb, field.Key, field.Value);

            Type objectType = tb.CreateType();

            return objectType;
        }

        private static TypeBuilder GetTypeBuilder()
        {
            var typeSignature = "MyDynamicType_" + DateTime.Now.ToString("yyyyMMddHHmmss");
            var an = new AssemblyName(typeSignature);
            AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
            TypeBuilder tb = moduleBuilder.DefineType(typeSignature,
                    TypeAttributes.Public |
                    TypeAttributes.Class |
                    TypeAttributes.AutoClass |
                    TypeAttributes.AnsiClass |
                    TypeAttributes.BeforeFieldInit |
                    TypeAttributes.AutoLayout,
                    null);
            return tb;
        }

        private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType)
        {
            FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);

            PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
            MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
            ILGenerator getIl = getPropMthdBldr.GetILGenerator();

            getIl.Emit(OpCodes.Ldarg_0);
            getIl.Emit(OpCodes.Ldfld, fieldBuilder);
            getIl.Emit(OpCodes.Ret);

            MethodBuilder setPropMthdBldr =
                tb.DefineMethod("set_" + propertyName,
                  MethodAttributes.Public |
                  MethodAttributes.SpecialName |
                  MethodAttributes.HideBySig,
                  null, new[] { propertyType });

            ILGenerator setIl = setPropMthdBldr.GetILGenerator();
            Label modifyProperty = setIl.DefineLabel();
            Label exitSet = setIl.DefineLabel();

            setIl.MarkLabel(modifyProperty);
            setIl.Emit(OpCodes.Ldarg_0);
            setIl.Emit(OpCodes.Ldarg_1);
            setIl.Emit(OpCodes.Stfld, fieldBuilder);

            setIl.Emit(OpCodes.Nop);
            setIl.MarkLabel(exitSet);
            setIl.Emit(OpCodes.Ret);

            propertyBuilder.SetGetMethod(getPropMthdBldr);
            propertyBuilder.SetSetMethod(setPropMthdBldr);
        }
    }

How to use

 public JsonResult DynamicObject()
        {

            Dictionary<string, Type> listOfFields = new Dictionary<string, Type>();

            listOfFields.Add("Name", typeof(string));
            listOfFields.Add("Age", typeof(int));
            var myType = MyTypeBuilder.CompileResultType(listOfFields);
            var myObject = Activator.CreateInstance(myType);

            myType.GetProperty("Name").SetValue(myObject, "Tuan", null);
            myType.GetProperty("Age").SetValue(myObject, 20, null);

            object name = myType.GetProperty("Name").GetValue(myObject);

            return Json(name.ToString(), JsonRequestBehavior.AllowGet);
            // return Json(myObject, JsonRequestBehavior.AllowGet);
        }

Mapping data to List

 public JsonResult DynamicObject2()
        {
            Dictionary<string, Type> listOfFields = new Dictionary<string, Type>();
            listOfFields.Add("Name", typeof(string));
            listOfFields.Add("Age", typeof(int));

            var myType = MyTypeBuilder.CompileResultType(listOfFields);
            var list = MyTypeBuilder.CreateInstanceIList(myType);
            var listString = listOfFields.Select(x => x.Key).ToArray();

            Type t = typeof(YourObject); // your class define
            PropertyInfo[] props = t.GetProperties().Where(x => listString.Contains(x.Name)).ToArray();

            var data = ListYourObjects(); // your list data

            // mapping only you need
            foreach (var item in data)
            {
                var myObject = Activator.CreateInstance(myType);
                foreach (var prop in props)
                {
                    object name = t.GetProperty(prop.Name).GetValue(item);
                    myType.GetProperty(prop.Name).SetValue(myObject, name, null);
                    
                }
                list.Add(myObject);
            }

            return Json(list, JsonRequestBehavior.AllowGet);
        }

 

SQL Server : random date in specific range (including random hours, minutes,…)

DECLARE @FromDate DATETIME = DATEADD(DAY, -10, GETDATE())
DECLARE @ToDate DATETIME = DATEADD(DAY, -12, GETDATE())

DECLARE @Seconds INT = DATEDIFF(SECOND, @FromDate, @ToDate)
DECLARE @Random INT = ROUND(((@Seconds-1) * RAND()), 0)
DECLARE @Milliseconds INT = ROUND((999 * RAND()), 0)

declare @newDate datetime = DATEADD(MILLISECOND, @Milliseconds, DATEADD(SECOND, @Random, @FromDate))

select @newDate

Lớp được niêm phong (Sealed class) là gì? Dùng trong những trường hợp nào?

Lớp được niêm phon (Sealed class) là một lớp không cho các lớp khác kế thừa từ nó. Ví dụ khi bạn phát triển một thư viện class nào đấy, trong đó có một lớp có đầy đủ những chức năng cần thiết cho một nghiệp vụ nào đấy và bạn không muốn lớp này được dẫn xuất, mở rộng bởi những lập trình viên kế thừa sau này, lúc đó bạn sử dụng lớp niêm phong với từ khóa sealed :

public sealed class A
{
public sealed void XinChao()
{ }
}

Một vài quy tắc khi sử dụng lớp niêm phong :

– Không được khai báo protected hay virtual trong lớp được niêm phong

Auto-activate WordPress Plugins

<?php

// Add to: path/to/wp-content/wp-themes/your-theme/functions.php

/**
 * Activate required plugins
 */

include_once ( ABSPATH . 'wp-admin/includes/plugin.php' );

foreach (array(
    'plugin-name',
) as $plugin) {
    $path = sprintf('%s/%s.php', $plugin, $plugin);

    if (!is_plugin_active( $path )) {
        activate_plugin( $path );

        add_action( 'admin_notices', function() use ($plugin) {
            echo '<div class="updated"><p>' . sprintf('<strong>%s</strong> plugin is required & auto-enabled by the current theme.', $plugin) . '</p></div>';
        } );
    }
}

How to convert GMT(UTC) Datetime to Local Datetime?

I have an insert proc that passes in GETDATE() as one of the values because each insert also stores when it was inserted. This is hosted on SQL Azure – which uses GMT.

Now, when I am receiving messages, I have the GMT date stored for each of them in their timestamp columns, how do I convert this to the local datetime for wherever you are when you are accessing my page?

You could do something like this:

declare @InputUtcDateTime datetime2 = '2016-06-24 06:30:18'

declare @LocalDateTime datetime2 = dateadd(minute, datepart(TZoffset, sysdatetimeoffset()), @InputUtcDateTime)
print @LocalDateTime

or

declare @InputUtcDateTime datetime2 = '2016-06-24 06:30:18'

declare @LocalDateTime datetime2 = dateadd(minute, datediff(minute, sysutcdatetime(), sysdatetime()), @InputUtcDateTime)
print @LocalDateTime

My T-SQL

DECLARE @utcdate DATETIME = '2016-06-24 06:30:18.127'
SELECT DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),@utcdate) AS currentLocalTime;

Real i used

update [Order]
set StockDate =  DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),StockDate),
OrderDate = DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),OrderDate),
ShipDate =  DATEADD(hh,DATEDIFF(hh,GETUTCDATE(),GETDATE()),ShipDate)

 

Cách thêm site mới vào IIS trên Windows 7, 8, 10

Chào các bạn.

Khi các bạn làm lập trình web, đặc biệt là rất nhiều bạn đang lập trình ASP.NET, ASP.NET MVC trên Visual Studio, mỗi lần cần phải chạy website lên để kiểm tra thì mất rất nhiều thời gian. Bạn nhấn F5 và chờ đợi. Tâm trạng cực kỳ ức chế. (Nếu máy tính của bạn cấu hình cao, SSD mới, RAM khủng, Core 7 thế hệ mới nhất thì chúc mừng bạn, bạn không cần quan tâm đến việc phải chờ đợi là mấy).

Và một lợi ích khá hay khi bạn dùng IIS để quản lý website của mình, đó là bạn sẽ biết cách chạy thực tế của một trang web như thế nào, sau này khi deploy sản phẩm bạn không cần phải tìm hiểu quá nhiều về nó nữa.

Khi đi demo sản phẩm cho khách hàng, hay demo đồ án, project với giáo viên, bạn không cần mở Visual Studio lên, vẫn demo ngon lành. Nếu có lỗi phần nào, bạn chỉ cần back lại mà không làm gián đoạn việc trình bày. Nếu bạn F5 bằng Visual, và có lỗi, chắc chắn là ấn tượng không được hay cho lắm. (Ở trường mình học, giáo viên không chấp nhận demo sản phẩm bằng việc F5 trong Visual Studio cho các sản phẩm web ASP.NET, phần mềm thì cũng nên đóng gói khi demo)

Với những lý do trên mà mình rất hay khuyên dùng IIS để chạy trang web của bạn. Nếu bạn đã biết làm thế nào để cài đặt IIS trên Windows của bạn, thì trong bài viết này hướng dẫn bạn cách thêm Site mới vào IIS.

Bài viết liên quan: Hướng dẫn cài đặt IIS trên Windows 7, 8, 10

Đầu tiên đây là dự án của tôi. Bình thường tôi dùng F5 để show kết quả, hoặc R_Click vào file nào đó chọn View in Browser (Ctrl + Shift + W). Bây giờ tôi không muốn thế nữa, nó trông không được chuyên nghiệp cho lắm, trừ khi bạn bắt buộc phải Debug.

add-site-vao-iis-2
[Hình 1 – Dự án website ASP.NET MVC]
Tôi cần xác định xem mình đang lưu code đó ở đâu? Ok, tìm thấy rồi

add-site-vao-iis-3
[Hình 2 – Thư mục chứa code của dự án Website]
Tiếp theo tôi sẽ mở IIS lên. Bạn có thể gõ IIS vào ô search tìm kiếm cho nhanh. Nếu không tìm thấy, hãy thử kiểm tra lại nhé, tôi có link cho bạn đây: http://tuanitpro.com/huong-dan-cai-dat-iis-tren-windows-7-8

add-site-vao-iis-1
[Hình 3 – Giao diện màn hình quản lý IIS]
Tôi đăng ký phiên bản của .NET cho Application Polls. Nếu bạn không tìm thấy dòng .NET CLR Version như bên dưới, hoặc chỉ có version 2.0 thì xem qua bài viết này nhé, http://tuanitpro.com/iis-7-5-error-handler-pagehandlerfactory-integrated

add-site-vao-iis-5
[Hình 4 – Đăng ký Application Polls IIS]
OK rồi. Qua Tab Sites

Chọn Sites -> Add Website, sau đó Nhập tên Website của bạn, nhấn Select chọn Application Poll. Tôi dùng MVC 5 nên chọn .NET 4.5

Trên dòng Physical path: Bạn chọn tới đường dẫn chứa thưa mục Web của bạn, chắc chắn có file Web.config với các ứng dụng web ASP.NET , bạn xem lại hình 2 của tôi nhé.

add-site-vao-iis-6
[Hình 5 – Thêm site mới vào IIS]
Nhấn OK, đây là màn hình quản lý riêng của Site tôi mới thêm vào.

add-site-vao-iis-7
[Hình 6 – Giao diện màn hình quản lý của Site Demo]
Cuối cùng, đây là kết quả của tôi.

add-site-vao-iis-8
[Hình 7 – Tân hưởng kết quả]
Chúc các bạn thành công.

Bài viết liên quan

WordPress 4.5 chính thức ra mắt, có gì mới?

Cuối cùng thì WordPress 4.5 với tên mã “Coleman” (lấy theo tên của nghệ sĩ saxophone nhạc jazz – Coleman Hawkins) đã chính thức được cập nhật tới tay người dùng. Phiên bản 4.5 có khá nhiều cải tiến mới, thú vị và hấp dẫn. Nếu bạn vẫn chưa cập nhật blog/ website WordPress của mình lên phiên bản 4.5 thì hãy dành ít phút để cùng xem liệu phiên bản này có gì đáng để nâng cấp nhé.

WordPress 4.5 "Coleman" chính thức ra mắt, có gì mới?
WordPress 4.5 “Coleman” chính thức ra mắt, có gì mới?

Video giới thiệu:


Cải tiến trình soạn thảo

1. Inline Linking

wordpress-45-chinh-sua-link-ngay-trong-bai-viet

Giờ đây, bạn có thể chỉnh sửa, bổ sung các liên kết (link) ngay trong phần soạn thảo văn bản mà không cần phải thực hiện trên một khung pop-up như trước nữa. Điều này giúp bạn tiết kiệm thời gian và tập trung hơn vào công việc viết lách.

2. Formatting Shortcuts

Bạn có thích sử dụng các phím tắt định dạng cho danh sách (list) và tiêu đề (heading)? Giờ đây, chúng đang trở nên dễ sử dụng hơn với các đường ngang (-) và <code>. Xem video bên trên để hiểu rõ hơn về tính năng này.

Cải tiến Customize

1. Live Responsive Previews

 

 wordpress-45-xem-truoc-giao-dien-voi-cac-kich-thuoc-man-hinh-khac-nhau

Từ phiên bản 4.5 trở đi, các bạn có thể xem những thay đổi trên giao diện của mình (với các kích thước màn hình khác nhau) ngay trong Customize. Đây thực sự là một tính năng tuyệt vời giúp các bạn test giao diện responsive.

2. Custom Logos

wordpress-45-logo-tuy-chinh-tren

Cho phép sử dụng logo (hình ảnh) tùy chỉnh không phải là một tính năng mới lạ đối với nhiều WordPress themes, tuy nhiên, đây là lần đầu tiền WordPress chính thức hỗ trợ nó trên các giao diện mặc định của mình.

3. Emoji trên Site Title

Bạn đã bao giờ nghĩ có thể sử dụng Emoji (các hình mặt cười) trong Site Title chưa? Tính năng này đã được mang lên phiên bản 4.5, mặc dù nhỏ như khá thú vị đấy chứ.

Một số thay đổi khác

1. Smart Image Resizing

Hình ảnh trên blog/ website WordPres của bạn giờ đây sẽ load nhanh hơn lên đến 50% mà không bị giảm chất lượng. Nó thực sự rất tuyệt.

2. Selective Refresh

Customize trên WordPress 4.5 sẽ hỗ trợ một comprehensive framework để render phần xem trước (previews) mà không cần viết mã PHP của bạn trong JavaScript.

3. Script Loader Improvements

Một sự hỗ trợ tốt hơn đã được bổ sung vào header/ footer scripts. wp_add_inline_script() mới sẽ cho phép bổ sung thêm các mã vào scripts đã khai báo.

4. Better Embed Templates

Embed templates đã được chia thành các phần và có thể được ghi đè trực tiếp theo themes, thông qua các hệ thống phân cấp template.

5. JavaScript Library Updates

jQuery 1.12.3, jQuery Migrate 1.4.0, Backbone 1.2.3 và Underscore 1.8.3 đã được đóng gói kèm trong phiên bản WordPress mới.

Ngoài ra còn rất nhiều cải tiến và nâng cấp nhỏ khác. eBooksvn.com đã tiến hành nâng cấp lên phiên bản WordPress 4.5 vào sáng nay. Còn bạn thì sao? Ngay bây giờ, hãy truy cập vào Dashboard =>Updates và click nút “Update Now” nhé.

wordpress-45-update

Bạn đã cập nhật WordPress 4.5 cho blog/ website của mình? Bạn đánh giá thế nào về phiên bảnWordPress mới này? Hãy chia sẻ với chúng tôi những suy nghĩ và ý kiến của bạn bằng cách sử dụng khung bình luận bên dưới.

Cách học lập trình ASP.NET MVC tốt nhất?

Bài viết được dịch từ trang web Danylkoweb

Cách học lập trình ASP.NET MVC tốt nhất là gì?
Cách học lập trình ASP.NET MVC tốt nhất là gì?

Gần đây tôi có tham dự một cuộc hội thảo CONDG hàng tháng và đã gặp một vài người có hứng thú trong việc học cách sử dụng ASP.NET MVC.

Thật trùng hợp, tôi cũng thấy có khá nhiều người trên mạng xã hội Quora hỏi về cách thức tốt nhất để học ASP.NET MVC. Ngoài việc thảo luận về cách tốt nhất để tìm hiểu nó, tôi cũng sẽ đưa ra những cách nhanh nhất để học lập trình ASP.NET MVC.

Học những kiến thức nền tảng trước

Nếu bạn là người chỉ mới bắt đầu làm quen với ASP.NET, thì bạn cần phải học VB.NET hoặc C# trước. Cả hai ngôn ngữ lập trình này là một phần của ASP.NET, do đó bạn cần phải quen thuộc với một (hoặc cả hai) ngôn ngữ.

Khi mới bắt đầu, tôi muốn giới thiệu tới bạn một cuốn sách C# của nhà xuất bản Apress có tên là Beginning C# Object-Oriented Programming của tác giả Dan Clark. Đây là một trong những cuốn sách có nội dung khá dễ hiểu dành cho người mới bắt đầu.

Nếu bạn là một người đã có kinh nghiệm lập trình trong (Java, C, C++, v.v…), thì tôi muốn giới thiệu tới bạn một cuốn sách khác từ Apress tên là Pro C# 5.0 and the .NET 4.5 Framework của tác giả Andrew Troelsen.

Bây giờ bạn biết mọi thứ về C#, lúc này bạn sẽ chuyển sang ASP.NET MVC.

Nếu bạn đang quan tâm đến cách làm thế nào để bắt đầu học Lập trình website với ASP.NET MVC thì tôi đang có Khóa học Lập trình ASP.NET MVC dành cho bạn đấy. Hình thức học linh hoạt, giúp bạn cách tiếp cận hoàn toàn khác biệt sách vở.

Bắt đầu tìm hiểu về ASP.NET MVC

Bạn có biết ASP.NET MVC là một nền tảng mã nguồn mở của Microsoft giúp cho công việc phát triển web của bạn trở nên dễ dàng hơn so với công nghệ trước đó của họ được gọi là WebForms. MVC là cụm từ viết tắt của Model-View-Controller. Đây là một pattern về kiến trúc phần mềm đã được hình thành từ những năm 1970 và 80.

Cách nhanh nhất để tìm hiểu một công nghệ mới là tìm hiểu sâu về cách mọi thứ hoạt động. Một cách để làm điều này đó là bạn hãy tải về và xem xét vòng đời của một ứng dụng web MVC. Đây là một tài liệu rất dễ hiểu và bổ ích. Tất cả mọi thứ được giải thích cho bạn qua những chi tiết cụ thể. Thậm chí tôi đã in nó ra và dán lên tường nơi bàn làm việc của mình.

Nếu bạn đang tìm kiếm một tài liệu để đọc, thì tôi muốn giới thiệu tới bạn cuốn sách có tên là Pro ASP.NET MVC 5 của tác giả Adam Freeman. Tôi đã thu được rất nhiều kiến thức cơ bản về lập trình ASP.NET MVC trong cuốn sách này và vẫn tham khảo lại khi cần.

Những khóa học lập trình trực tuyến

Nếu bạn đang tìm kiếm một khóa học lập trình trực tuyến chất lượng, thì một trong những trang web tôi yêu thích và thường hay lui tới là Pluralsight. Pluralsight có hơn 1.000 khóa học về tất cả mọi thứ từ lập trình web tới di động và ảo hóa. Bạn phải trả $30/tháng và tham gia các khóa học không giới hạn.

Về các khóa học ASP.NET MVC, tôi muốn giới thiệu tới bạn các khóa học Pluralsight sau đây:

  • ASP.NET MVC 5 Fundamentals – Scott Allen
  • Automated ASP.NET MVC Testing: End to End – Jason Roberts
  • Architecting Applications for the Real World in .NET – Cory House

Hầu hết các khóa học này có thời lượng từ 2 đến 3 giờ, bởi vậy bạn hãy dành đủ thời gian để hoàn thành các khóa học chất lượng này nhé!

Tạo ra một sản phẩm thú vị

Cuối cùng, hãy bắt đầu áp dụng kiến thức bạn đã học được bằng cách xây dựng một sản phẩm gì đó. Bạn đã học đến lúc này, tại sao lại không bắt đầu xây dựng một ứng dụng web? Dưới đây là một vài ý tưởng để giúp bạn bắt đầu:

  • Tạo ra một ứng dụng dạng To-do list (danh sách công việc phải làm)
  • Xây dựng một danh sách liên lạc (contact list)
  • Viết một blog nhỏ

Kết luận

Ưu điểm của phương pháp học này là bạn có thể áp dụng kiến thức đã học vào thực tế một cách nhanh chóng. Và bạn cũng có thể áp dụng cách học này cho những ngôn ngữ lập trình khác.

Viết code trong các ngôn ngữ lập trình khác sẽ trở nên ngày càng dễ dàng hơn cùng với kinh nghiệm mà bạn đã tạo ra cho chính mình.

Bạn có cách nào nhanh hơn để tìm hiểu về ASP.NET MVC? Hãy để lại ý kiến của mình trong phần bình luận phía dưới nhé!

Về tác giả bài viết:

hoc-lap-trinh-truc-tuyen-online-aspnet-mvc-tot-nhat-14012016-2Tác giả bài viết là Jonathan Danylko. Anh là người có trên 30 năm kinh nghiệm lập trình và hiện nay Jonathan đang tập trung vào lĩnh vực ASP.NET MVC Best Practices, Code Exorcisms (refactorings)…

 

Nguồn bài dịch: Techmaster.vn

C# MDI Form

A Multiple Document Interface (MDI) programs can display multiple child windows inside them. This is in contrast to single document interface (SDI) applications, which can manipulate only one document at a time. Visual Studio Environment is an example of Multiple Document Interface (MDI) and notepad is an example of an SDI application. MDI applications often have a Window menu item with submenus for switching between windows or documents.

mdiform

Any windows can become an MDI parent, if you set the IsMdiContainer property to True.

IsMdiContainer = true;

The following C# program shows a MDI form with two child forms. Create a new C# project, then you will get a default form Form1 . Then add two mnore forms in the project (Form2 , Form 3) . Create a Menu on your form and call these two forms on menu click event.

NOTE: If you want the MDI parent to auto-size the child form you can code like this.

  form.MdiParent = this;
  form.Dock=DockStyle.Fill;
  form.Show();

Full Code

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            IsMdiContainer = true;
        }

        private void menu1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 frm2 = new Form2();
            frm2.Show();
            frm2.MdiParent = this;
        }

        private void menu2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form3 frm3 = new Form3();
            frm3.Show();
            frm3.MdiParent = this;
        }
    }
}