Tôi không biết về bất kỳ thư viện nào thực hiện điều này - nhưng bạn có thể viết của riêng bạn khá dễ dàng.
Dưới đây là một cơ sở Tôi gõ lên trong một vài phút mà thiết lập hai dữ liệu theo cách ràng buộc giữa hai thuộc tính đơn giản:
public static class Binder
{
public static void Bind(
INotifyPropertyChanged source,
string sourcePropertyName,
INotifyPropertyChanged target,
string targetPropertyName)
{
var sourceProperty
= source.GetType().GetProperty(sourcePropertyName);
var targetProperty
= target.GetType().GetProperty(targetPropertyName);
source.PropertyChanged +=
(s, a) =>
{
var sourceValue = sourceProperty.GetValue(source, null);
var targetValue = targetProperty.GetValue(target, null);
if (!Object.Equals(sourceValue, targetValue))
{
targetProperty.SetValue(target, sourceValue, null);
}
};
target.PropertyChanged +=
(s, a) =>
{
var sourceValue = sourceProperty.GetValue(source, null);
var targetValue = targetProperty.GetValue(target, null);
if (!Object.Equals(sourceValue, targetValue))
{
sourceProperty.SetValue(source, targetValue, null);
}
};
}
}
Tất nhiên, mã này thiếu một vài niceties. Những điều cần thêm bao gồm
- Kiểm tra rằng
source
và target
được giao
- Kiểm tra rằng các thuộc tính xác định bởi
sourcePropertyName
và targetPropertyName
tồn tại
- Kiểm tra cho loại tương thích giữa hai thuộc tính
Ngoài ra, Reflection tương đối chậm (mặc dù điểm chuẩn trước khi loại bỏ nó, nó không phải là rằng chậm), vì vậy bạn có thể muốn sử dụng được biên dịch thay vào đó.
Cuối cùng, do việc xác định các thuộc tính theo chuỗi là dễ bị lỗi, bạn có thể sử dụng các biểu thức LINQ và các phương thức mở rộng thay thế. Sau đó, thay vì viết
Binder.Bind(source, "Name", target, "Name")
bạn có thể viết
source.Bind(Name => target.Name);
Tôi thực sự hỏi vì tôi đang cân nhắc việc viết của riêng mình. Không muốn phát minh lại bánh xe và tất cả ... cảm ơn. –
Cập nhật: Tôi đã liên kết với thư viện của tôi trong câu hỏi. –
Tôi cần một lớp dữ liệu barebone đơn giản cho dự án hiện tại của tôi-trong-một-vội vàng, và một ở trên gần như phù hợp với những gì tôi cần. Tôi chỉ thay thế các tên thuộc tính được sử dụng với Reflection bởi hai đại biểu Action trong đó tôi nhận được/thiết lập từ POCO và áp dụng các phép biến đổi và định dạng. Tôi chắc chắn sẽ cố gắng hết sức để Truss trong một dự án tiếp theo, bởi vì nó có vẻ thực sự gây trở ngại cho tôi. – Larry