Tôi phải tạo phương thức để chọn thuộc tính firts từ bộ sưu tập với loại được chỉ định.Chỉ đặt loại đối số thứ hai theo phương thức chung
Tôi đã tạo ra phương pháp như thế này (tôi đã xóa một số phụ tùng cho các ngắn gọn):
public static IQueryable<TResult> SelectFirstPropertyWithType<T, TResult>(this IQueryable<T> source)
{
// Get the first property which has the TResult type
var propertyName = typeof(T).GetProperties()
.Where(x => x.PropertyType == typeof(TResult))
.Select(x => x.Name)
.FirstOrDefault();
var parameter = Expression.Parameter(typeof(T));
var body = Expression.Convert(Expression.PropertyOrField(parameter, propertyName), typeof(TResult));
var expression = Expression.Lambda<Func<T, TResult>>(body, parameter);
return source.Select(expression);
}
Và tôi có thể gọi phương pháp này như:
List<Person> personList = new List<Person>();
// .. initialize personList
personList.AsQueryable()
.SelectFirstPropertyWithType<Person, int>()
.ToList();
Tất cả mọi thứ hoạt động tốt.
Nhưng, tôi không muốn đặt loại đối số đầu tiên là Person
, vì trình biên dịch có thể suy ra loại đối số này từ nguồn của bộ sưu tập. Có cách nào để gọi phương thức như thế:
.SelectFirstPropertyWithType<int>()
Vấn đề là tôi cần T
tham số bên trong phương pháp của tôi, và tôi không muốn tạo Func
với sự phản ánh trong thời gian chạy.
Cảm ơn.
Có nhiều câu hỏi tương tự về vấn đề này. Câu trả lời đơn giản - bạn không thể làm điều gì đó như thế. Trình biên dịch có thể suy ra tất cả các loại hoặc không có –