2017-08-29 25 views
7

Tôi có một mô hình Entity Framework Code First mà tôi đã tạo một lớp chung chung tĩnh có một phương thức tìm kiếm được gọi cho mọi mục trong một danh sách. Thừa nhận rằng điều này là trên đầu của tôi, tôi nghĩ làm cho lớp tĩnh sẽ cải thiện rõ ràng mã và thậm chí có thể thực hiện như một trong những không phải tạo ra các trường hợp ở nhiều nơi khác nhau. Mục tiêu của tất cả điều này là để tự động hoá các thuộc tính nào có thể được tìm kiếm, xuất, vv bởi người dùng.Gọi cho MakeGenericType (...) nhiều lần có tạo ra kiểu mới mỗi lần không?

Câu hỏi chính là: Nếu MakeGenericType (...) được gọi cho mọi mục (có khả năng 1000) có thuộc tính loại tham chiếu, là loại chung cho thuộc tính loại tham chiếu được tạo một lần và được lưu ở đâu đó hoặc tạo 1000 giây lần?

Chỉ ra bất kỳ tội phạm hoặc hiệu suất mã nào khác được đánh giá cao.

public static class SearchUserVisibleProperties<T> 
{ 
    private static List<PropertyInfo> userVisibleProperties { get; set; } 

    static SearchUserVisibleProperties() 
    { 
     userVisibleProperties = typeof(T).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(UserVisibleAttribute))).ToList(); 
    } 

    public static bool search(T item, string searchString) 
    { 
     foreach (PropertyInfo pInfo in userVisibleProperties) 
     { 
      object value = pInfo.GetValue(item); 
      if (value == null) 
      { 
       continue; 
      } 
      if (pInfo.PropertyType == typeof(string) || pInfo.PropertyType.IsValueType) 
      { 
       ...unrelevant string matching code... 
      } 
      else if ((bool)typeof(SearchUserVisibleProperties<>).MakeGenericType(new Type[] { value.GetType() }).InvokeMember(nameof(search), BindingFlags.InvokeMethod, null, null, new object[] { value, searchString })) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
} 
+0

Cảm ơn cho câu hỏi! Tôi luôn luôn giả định rằng một loại mới được tạo ra mỗi lần, và thêm vào lớp bộ nhớ đệm của riêng tôi để ngăn chặn điều này. Trong thực tế, tôi đã viết mã cho câu trả lời với kỳ vọng để xem 'False' được in hai lần. Nó chỉ ra rằng tôi có thể loại bỏ bộ nhớ đệm của tôi một cách an toàn ngay bây giờ! – dasblinkenlight

+1

Lưu ý rằng 'new Type [] {value.GetType()}' là không cần thiết, bởi vì tham số 'typeArguments' của' MakeGenericType' được khai báo với từ khóa 'params'. Một mảng mới sẽ được tạo theo một trong hai cách, nhưng nó sẽ không làm xáo trộn mã của bạn. – dasblinkenlight

+0

Nếu tôi loại bỏ 'new Type [] {value.GetType()}', nó đưa ra một 'ArgumentException' là' lớp SearchUserVisibleProperties 'có một tham số chung cần được cung cấp, đúng không? Vì vậy, không có hiệu suất rõ ràng/mùi cải tiến cho mã của tôi? Cảm thấy một chút tự hào sau khi lắp ráp nó trong vài giờ :). Cảm ơn câu trả lời! – Tom

Trả lời

7

Documentation of MakeGenericType gợi ý rằng các loại trở lại cho cùng một kết hợp của định nghĩa kiểu chung chung và đối số kiểu chung chung sẽ giống nhau:

Đối tượng Type trả về bởi MakeGenericType là giống như Type thu được bằng cách gọi phương thức GetType của kiểu kết quả được xây dựng hoặc phương thức GetType của bất kỳ kiểu được tạo nào đã được tạo từ cùng một định nghĩa kiểu chung bằng cách sử dụng cùng một đối số kiểu.

Đây là một thử nghiệm nhỏ để chứng minh rằng ở trên là đúng:

Các vấn đề liên quan