sách gpt4 ăn đã đi

Phản chiếu C#

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 2023-05-01 22:31:32 35 4
mua khóa gpt4 giày nike

Giới thiệu về C# Reflection

Phản chiếu là một cơ chế rất hữu ích trong ngôn ngữ C#. Nó có thể lấy thông tin kiểu của một đối tượng một cách linh hoạt trong thời gian chạy và thực hiện các thao tác tương ứng. Reflection là một công nghệ được sử dụng rộng rãi trong .NET Framework. Nó là cơ sở để đạt được các tính năng trên và rất quan trọng.

Sự phản ánh có thể làm gì?

Việc sử dụng sự phản chiếu cho phép chúng ta lấy thông tin kiểu của đối tượng một cách linh hoạt trong thời gian chạy và thực hiện các thao tác tương ứng, chẳng hạn như tạo đối tượng, gọi phương thức, lấy thuộc tính, v.v. Để đưa ra một ví dụ đơn giản, khi chúng ta viết mã, để có thể gọi một phương thức của một đối tượng, chúng ta thường cần tạo một thể hiện của đối tượng trước khi có thể gọi phương thức của nó. Bằng cách sử dụng cơ chế phản chiếu, chúng ta có thể tự động tạo các đối tượng trong thời gian chạy và gọi trực tiếp các phương thức của chúng mà không cần phải xác định trước.

Những ứng dụng cơ bản của sự phản chiếu

Cốt lõi của sự phản chiếu là lớp Type, đại diện cho các kiểu trong .NET Framework, tức là các lớp, cấu trúc, bảng liệt kê, v.v. Chúng ta có thể sử dụng lớp Type để lấy kiểu được xác định trong hợp ngữ, lấy các thành viên của kiểu, tạo một thể hiện của kiểu, v.v. Dưới đây chúng tôi đưa ra một số trường hợp sử dụng cơ bản của sự phản ánh.

1. Nhận thông tin loại

Lấy thông tin kiểu là một trong những cách sử dụng cơ bản nhất của sự phản chiếu. Chúng ta có thể sử dụng phương thức tĩnh GetType của lớp Type để lấy thông tin kiểu, như được hiển thị bên dưới.

                                
                                  sử dụng
                                
                                
                                   Hệ thống;

                                
                                
                                  không gian tên
                                
                                
                                   Phản chiếuDemo {
    
                                
                                
                                  lớp học
                                
                                
                                   Chương trình {
        
                                
                                
                                  tĩnh
                                
                                
                                  vô hiệu
                                
                                 Chủ yếu(
                                
                                  sợi dây
                                
                                
                                  [] args) { Kiểu loại 
                                
                                = 
                                
                                  loại của
                                
                                (
                                
                                  sợi dây
                                
                                
                                  ); Console.WriteLine(kiểu.FullName); Console.ReadKey(); } } }
                                
                              

Trong ví dụ này, chúng ta thu được đối tượng Type của loại chuỗi, sau đó xuất ra thuộc tính FullName của đối tượng này, đây là tên đủ điều kiện của loại chuỗi System.String.

2. Tạo đối tượng thông qua sự phản chiếu

Việc sử dụng sự phản chiếu có thể tạo các đối tượng một cách linh hoạt trong thời gian chạy, điều này hỗ trợ rất nhiều cho công việc lập trình của chúng tôi. Ví dụ, chúng ta thường phải viết một lớp nhà máy để tạo các đối tượng khác nhau theo các loại khác nhau, nhưng sử dụng sự phản chiếu có thể tạo ra các đối tượng mà không cần đến lớp nhà máy. Dưới đây là một ví dụ đơn giản.

                                  
                                    sử dụng
                                  
                                  
                                     Hệ thống;

                                  
                                  
                                    sử dụng
                                  
                                  
                                     Hệ thống.Phản chiếu;


                                  
                                  
                                    không gian tên
                                  
                                  
                                     Phản chiếuDemo {
    
                                  
                                  
                                    lớp học
                                  
                                  
                                     Lớp học của tôi {
        
                                  
                                  
                                    công cộng
                                  
                                  
                                    số nguyên
                                  
                                   Nhận dạng { 
                                  
                                    lấy
                                  
                                  ; 
                                  
                                    bộ
                                  
                                  
                                    ; }
        
                                  
                                  
                                    công cộng
                                  
                                  
                                    sợi dây
                                  
                                   Tên { 
                                  
                                    lấy
                                  
                                  ; 
                                  
                                    bộ
                                  
                                  
                                    ; } }

    
                                  
                                  
                                    lớp học
                                  
                                  
                                     Chương trình {
        
                                  
                                  
                                    tĩnh
                                  
                                  
                                    vô hiệu
                                  
                                   Chủ yếu(
                                  
                                    sợi dây
                                  
                                  
                                    [] đối số) {
            
                                  
                                  
                                    //
                                  
                                  
                                     Lấy đối tượng kiểu của MyClass
                                  
                                  
            Nhập myClassType = 
                                  
                                    loại của
                                  
                                  
                                    (Lớp học của tôi);

            
                                  
                                  
                                    //
                                  
                                  
                                     Tạo một thể hiện của loại MyClass
                                  
                                  
            Lớp của tôi Lớp của tôi =
                                  
                                     (MyClass)Activator.CreateInstance(myClassType);

            
                                  
                                  
                                    //
                                  
                                  
                                     Đặt giá trị thuộc tính đối tượng
                                  
                                  
            Thông tin thuộc tính propId = myClassType.GetProperty(
                                  
                                    "
                                  
                                  
                                    Nhận dạng
                                  
                                  
                                    "
                                  
                                  
                                    ); propId.SetValue(myClass, 
                                  
                                  
                                    100
                                  
                                  
                                    ); Thông tin thuộc tính propName 
                                  
                                  = myClassType.GetProperty(
                                  
                                    "
                                  
                                  
                                    Tên
                                  
                                  
                                    "
                                  
                                  
                                    ); propName. SetValue(myClass, 
                                  
                                  
                                    "
                                  
                                  
                                    Tom
                                  
                                  
                                    "
                                  
                                  
                                    );

            
                                  
                                  
                                    //
                                  
                                  
                                     In giá trị thuộc tính đối tượng
                                  
                                  
                                                Console.WriteLine(myClass.Id); Console.WriteLine(myClass.Name); Console.ReadLine(); } } }
                                  
                                

Trong đoạn mã trên, trước tiên chúng ta lấy một đối tượng thuộc loại MyClass, sau đó gọi phương thức Activator.CreateInstance để tạo một phiên bản của loại này. Tiếp theo, chúng ta sử dụng đối tượng PropertyInfo để lấy và đặt các giá trị thuộc tính của đối tượng và cuối cùng in các giá trị thuộc tính đó. Trên đây là quá trình tạo đối tượng trong C# bằng cơ chế phản chiếu.

3. Phương pháp gọi phản ánh

Sử dụng sự phản chiếu để gọi động các phương thức đối tượng khi chạy. Chúng ta có thể sử dụng lớp MethodInfo để lấy thông tin phương thức, sau đó gọi phương thức MethodInfo.Invoke để gọi phương thức này, như hiển thị bên dưới.

                                        
                                          sử dụng
                                        
                                        
                                           Hệ thống;

                                        
                                        
                                          sử dụng
                                        
                                        
                                           Hệ thống.Phản chiếu;

                                        
                                        
                                          không gian tên
                                        
                                        
                                           Phản chiếuDemo {
    
                                        
                                        
                                          lớp học
                                        
                                        
                                           Chương trình {
        
                                        
                                        
                                          tĩnh
                                        
                                        
                                          vô hiệu
                                        
                                         Chủ yếu(
                                        
                                          sợi dây
                                        
                                        
                                          [] args) { Kiểu loại 
                                        
                                        = 
                                        
                                          loại của
                                        
                                        (
                                        
                                          sợi dây
                                        
                                        
                                          ); Phương pháp MethodInfo 
                                        
                                        = loại. GetMethod(
                                        
                                          "
                                        
                                        
                                          Lên trên
                                        
                                        
                                          "
                                        
                                        , 
                                        
                                          mới
                                        
                                        
                                           Kiểu[] { });
            
                                        
                                        
                                          sợi dây
                                        
                                         kết quả = (
                                        
                                          sợi dây
                                        
                                        )phương pháp.Invoke(
                                        
                                          "
                                        
                                        
                                          Xin chào thế giới
                                        
                                        
                                          "
                                        
                                        , 
                                        
                                          vô giá trị
                                        
                                        
                                          ); Console.WriteLine(kết quả); Console.ReadKey(); } }
                                          
}

Trong ví dụ này, chúng ta lấy thông tin phương thức ToUpper của loại chuỗi, sau đó sử dụng phương thức Invoke để gọi phương thức này nhằm chuyển đổi chuỗi "Hello World" thành đầu ra chữ hoa.

Sử dụng nâng cao sự phản chiếu

Việc sử dụng phản chiếu nâng cao đề cập đến việc sử dụng phản chiếu để triển khai các chức năng lập trình nâng cao hơn, chẳng hạn như generics, LINQ, v.v. Dưới đây chúng tôi đưa ra một vài ví dụ để hiển thị cách sử dụng nâng cao của sự phản chiếu.

1. Nhận thông tin phương pháp chung

Bạn có thể sử dụng sự phản chiếu để thu thập thông tin động về các phương thức chung trong thời gian chạy và sau đó xây dựng kiểu chung trong thời gian chạy. Dưới đây là một ví dụ.

 
                                                  
                                                    sử dụng
                                                  
                                                  
                                                     Hệ thống;

                                                  
                                                  
                                                    sử dụng
                                                  
                                                  
                                                     Hệ thống.Phản chiếu;

                                                  
                                                  
                                                    không gian tên
                                                  
                                                  
                                                     Phản chiếuDemo {
    
                                                  
                                                  
                                                    lớp học
                                                  
                                                  
                                                     Chương trình {
        
                                                  
                                                  
                                                    tĩnh
                                                  
                                                  
                                                    vô hiệu
                                                  
                                                   Chủ yếu(
                                                  
                                                    sợi dây
                                                  
                                                  
                                                    [] args) { Kiểu loại 
                                                  
                                                  = 
                                                  
                                                    loại của
                                                  
                                                  
                                                    (Chương trình); Phương pháp MethodInfo 
                                                  
                                                  = loại. GetMethod(
                                                  
                                                    "
                                                  
                                                  
                                                    Phương pháp thử nghiệm
                                                  
                                                  
                                                    "
                                                  
                                                  
                                                    ); Phương thứcThông tin chungPhương pháp 
                                                  
                                                  = phương thức.MakeGenericMethod(
                                                  
                                                    loại của
                                                  
                                                  (
                                                  
                                                    sợi dây
                                                  
                                                  
                                                    )); Phương pháp chung. Gọi(
                                                  
                                                  
                                                    vô giá trị
                                                  
                                                  , 
                                                  
                                                    vô giá trị
                                                  
                                                  
                                                    ); Console.ReadKey(); }
        
                                                  
                                                  
                                                    công cộng
                                                  
                                                  
                                                    tĩnh
                                                  
                                                  
                                                    vô hiệu
                                                  
                                                   Phương pháp thử nghiệm
                                                  
                                                    () { Console.WriteLine(
                                                  
                                                  
                                                    loại của
                                                  
                                                  
                                                    (T).Họ và tên); } } }
                                                  
                                                

Trong ví dụ này, chúng tôi sử dụng phương thức GetMethod để lấy thông tin về phương thức TestMethod, sau đó sử dụng phương thức MakeGenericMethod để xây dựng một phương thức chung và chuyển đổi nó thành lớp MethodInfo cho đầu ra.

2. Xây dựng truy vấn LINQ khi chạy

Sử dụng sự phản chiếu để xây dựng các truy vấn LINQ một cách linh hoạt dựa trên các điều kiện truy vấn trong thời gian chạy. Dưới đây là một ví dụ.

 
                                                        
                                                          sử dụng
                                                        
                                                        
                                                           Hệ thống;

                                                        
                                                        
                                                          sử dụng
                                                        
                                                        
                                                           Hệ thống.Bộ sưu tập.Chung;

                                                        
                                                        
                                                          sử dụng
                                                        
                                                        
                                                           Hệ thống. Linq;

                                                        
                                                        
                                                          sử dụng
                                                        
                                                        
                                                           Hệ thống.Linq.Biểu thức;

                                                        
                                                        
                                                          sử dụng
                                                        
                                                        
                                                           Hệ thống.Phản chiếu;


                                                        
                                                        
                                                          không gian tên
                                                        
                                                        
                                                           Phản chiếuDemo {
    
                                                        
                                                        
                                                          lớp học
                                                        
                                                        
                                                           Thực thể của tôi {
        
                                                        
                                                        
                                                          công cộng
                                                        
                                                        
                                                          số nguyên
                                                        
                                                         Nhận dạng { 
                                                        
                                                          lấy
                                                        
                                                        ; 
                                                        
                                                          bộ
                                                        
                                                        
                                                          ; }
        
                                                        
                                                        
                                                          công cộng
                                                        
                                                        
                                                          sợi dây
                                                        
                                                         Tên { 
                                                        
                                                          lấy
                                                        
                                                        ; 
                                                        
                                                          bộ
                                                        
                                                        
                                                          ; } }

    
                                                        
                                                        
                                                          lớp học
                                                        
                                                        
                                                           Chương trình {
        
                                                        
                                                        
                                                          tĩnh
                                                        
                                                        
                                                          vô hiệu
                                                        
                                                         Chủ yếu(
                                                        
                                                          sợi dây
                                                        
                                                        
                                                          [] đối số) {
            
                                                        
                                                        
                                                          //
                                                        
                                                        
                                                           Xây dựng điều kiện truy vấn
                                                        
                                                        
                                                          sợi dây
                                                        
                                                         Tên trường = 
                                                        
                                                          "
                                                        
                                                        
                                                          Nhận dạng
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                          ;
            
                                                        
                                                        
                                                          số nguyên
                                                        
                                                         trườngGiá trị = 
                                                        
                                                          100
                                                        
                                                        
                                                          ;

            
                                                        
                                                        
                                                          //
                                                        
                                                        
                                                           Nhận thông tin trường và loại thời gian chạy
                                                        
                                                        
            Loại thực thểType = 
                                                        
                                                          loại của
                                                        
                                                        
                                                          (MyEntity); Thuộc tính PropertyInfo 
                                                        
                                                        =
                                                        
                                                           entityType.GetProperty(tên trường);

            
                                                        
                                                        
                                                          //
                                                        
                                                        
                                                           Xây dựng điều kiện truy vấn bằng cây biểu thức
                                                        
                                                        
            Tham số ParameterExpression = Expression.Parameter(entityType, 
                                                        
                                                          "
                                                        
                                                        
                                                          x
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                          ); Thành viên MemberExpression 
                                                        
                                                        =
                                                        
                                                           Expression.Property(tham số, thuộc tính); Hằng sốBiểu thức hằng số 
                                                        
                                                        =
                                                        
                                                           Biểu thức. Hằng số(fieldValue, property.PropertyType); Biểu thức nhị phân bằng 
                                                        
                                                        =
                                                        
                                                           Biểu thức.Equal(thành viên, hằng số); Biểu thức
                                                        
                                                        <>
                                                          bool
                                                        
                                                        >> biểu thức = Biểu thức.Lambda<>
                                                          bool
                                                        
                                                        >>
                                                        
                                                          (bằng nhau, tham số);

            
                                                        
                                                        
                                                          //
                                                        
                                                        
                                                           Thực hiện truy vấn
                                                        
                                                        
            Các thực thể IQueryable = 
                                                        
                                                          mới
                                                        
                                                         Danh sách
                                                        
                                                          
            {
                
                                                        
                                                        
                                                          mới
                                                        
                                                         Thực thể của tôi { Id = 
                                                        
                                                          100
                                                        
                                                        , Tên = 
                                                        
                                                          "
                                                        
                                                        
                                                          Alice
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                           },
                
                                                        
                                                        
                                                          mới
                                                        
                                                         Thực thể của tôi { Id = 
                                                        
                                                          200
                                                        
                                                        , Tên = 
                                                        
                                                          "
                                                        
                                                        
                                                          Bob
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                           },
                
                                                        
                                                        
                                                          mới
                                                        
                                                         Thực thể của tôi { Id = 
                                                        
                                                          300
                                                        
                                                        , Tên = 
                                                        
                                                          "
                                                        
                                                        
                                                          Charlie
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                           },
                
                                                        
                                                        
                                                          mới
                                                        
                                                         Thực thể của tôi { Id = 
                                                        
                                                          400
                                                        
                                                        , Tên = 
                                                        
                                                          "
                                                        
                                                        
                                                          Đavít
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                           }, }.AsQueryable(); có thể truy vấn được
                                                        
                                                        Truy vấn  =
                                                        
                                                           entities.Where(biểu thức);

            
                                                        
                                                        
                                                          //
                                                        
                                                        
                                                           Kết quả truy vấn đầu ra
                                                        
                                                        
                                                          foreach
                                                        
                                                         (Thực thể MyEntity 
                                                        
                                                          TRONG
                                                        
                                                        
                                                           truy vấn) { Console.WriteLine($
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                          Id={entity.Id}, Tên={entity.Name}
                                                        
                                                        
                                                          "
                                                        
                                                        
                                                          ); } Console.ReadLine(); }

        
                                                        
                                                        
                                                          tĩnh
                                                        
                                                        
                                                          sự vật
                                                        
                                                        
                                                           CreateWhereLambda(Loại elementType) { MethodInfo whereMethod 
                                                        
                                                        = 
                                                        
                                                          loại của
                                                        
                                                        (Chương trình).GetMethod(nameof(CreateWhereLambdaImpl), BindingFlags.NonPublic |
                                                        
                                                           BindingFlags. Static);
            
                                                        
                                                        
                                                          trở lại
                                                        
                                                         whereMethod.MakeGenericMethod(elementType).Invoke(
                                                        
                                                          vô giá trị
                                                        
                                                        , 
                                                        
                                                          vô giá trị
                                                        
                                                        
                                                          ); }

        
                                                        
                                                        
                                                          tĩnh
                                                        
                                                         Chức năng 
                                                          bool
                                                        
                                                        > TạoWhereLambdaImpl
                                                        
                                                          () {
            
                                                        
                                                        
                                                          trở lại
                                                        
                                                         mục => (
                                                        
                                                          số nguyên
                                                        
                                                        )(
                                                        
                                                          sự vật
                                                        
                                                        )mục % 
                                                        
                                                          2
                                                        
                                                         == 
                                                        
                                                          0
                                                        
                                                        
                                                          ; } } }
                                                        
                                                      

Trong ví dụ trên, trước tiên chúng tôi xác định một điều kiện truy vấn, sau đó lấy thông tin trường và loại thời gian chạy, sau đó sử dụng cây biểu thức để xây dựng điều kiện truy vấn và sử dụng sự phản chiếu để thực thi truy vấn LINQ. Cuối cùng, kết quả đầu ra của chúng tôi chỉ bao gồm các thực thể có Id bằng 100.

Những điều cần lưu ý khi sử dụng sự phản chiếu

Việc sử dụng sự phản chiếu đòi hỏi sự chú ý đặc biệt đến các vấn đề về hiệu suất và bảo mật.

  1. Cố gắng sử dụng các tập hợp đã được biên dịch và tránh sử dụng các tập hợp được biên dịch động.
  2. Hiệu suất phản chiếu thấp nên hãy sử dụng nó càng ít càng tốt.
  3. Phản ánh có sơ hở và vấn đề bảo mật cần được chú ý.
  4. Việc ủy ​​quyền có thể ngăn chặn việc lạm dụng quyền phản ánh và quyền sử dụng quyền phản ánh phải được cấp phép theo tình hình thực tế.

Tóm tắt

Qua nghiên cứu bài viết này, chúng ta hiểu được các khái niệm cơ bản và cách sử dụng Reflection, đồng thời nắm vững cách sử dụng Reflection nâng cao. Reflection là một công nghệ rất mạnh mẽ và cần thiết trong C#. Nếu được sử dụng hợp lý, nó có thể giúp công việc lập trình của chúng ta hiệu quả và thuận tiện hơn. Đồng thời, chúng ta cũng cần đặc biệt chú ý đến các vấn đề về hiệu suất và bảo mật trong quá trình sử dụng phản chiếu, đồng thời thực hiện tốt công việc ủy ​​quyền mẫu và các công việc khác để sử dụng tốt hơn chức năng phản chiếu mạnh mẽ.

 

Cuối cùng, bài viết về phản ánh C# kết thúc tại đây. Nếu bạn muốn biết thêm về phản ánh C#, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

35 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress