Tôi đang cố gắng cải thiện mã phản chiếu của mình bằng cách tạo đại biểu cho các phương pháp Getter
và Setter
.Đúc một đại biểu vào một hành động <T> hoặc Func <T> trong thời gian chạy
Mã của tôi trông như thế này:
MyObject obj = new MyObject();
var prop = obj.GetType().GetProperty("Prop");
var getType = typeof(Func<>).MakeGenericType(prop.PropertyType);
var setType = typeof(Action<>).MakeGenericType(prop.PropertyType);
var getMethod = prop.GetGetMethod().CreateDelegate(getType, obj);
var setMethod = prop.GetSetMethod().CreateDelegate(setType, obj);
// I'd like to change this section and not to use a dynamic!!
dynamic castedGet = Convert.ChangeType(getMethod, getType);
dynamic castedSet = Convert.ChangeType(setMethod, setType);
CreateDelegate
trả về một Delegate
và sử dụng DynamicInvoke
không phải là hiệu suất khôn ngoan.
Tôi được đúc (mã hoá) Delegate
thành Action<T> \ Func<T>
và thấy hiệu suất của tôi tăng rất lớn.
sau đó tôi đã cố gắng để đúc các Delegate
vào Action<T> \ Func<T>
trong thời gian chạy (sử dụng Convert.ChangeType
và dynamic
) và hiệu suất của tôi bị tổn thương - có thể là do thực tế là tôi đang sử dụng một loại dynamic
.
Tôi khá chắc chắn rằng tôi có thể thực hiện việc này mà không cần dynamic
.
tôi đoán giải pháp có cái gì để làm với expression trees
, nhưng tôi không thực sự chắc chắn làm thế nào để mã hóa một cái gì đó như thế này. Nếu ai đó có giải pháp tốt không sử dụng số expression trees
thì cũng sẽ rất thú vị khi nghe về giải pháp đó.
Bạn có đang thực thi tất cả mã này * mọi lần * hay bộ nhớ đệm đại biểu ở đâu đó và sau đó gọi cho họ không? – Dai
@Dai - Đây là một phần nhỏ của mã của tôi và loại mẫu. Tôi đang tìm kiếm để cache các propertyinfo, getter, setter cho mỗi tài sản - một cách lười biếng. –
Tại sao bạn vẫn sử dụng 'dynamic'? 'Convert.ChangeType' không trả về một đối tượng bị ràng buộc trễ. – Dai