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;
}
}
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
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
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