Nếu loại cơ bản của IDictionary
không thực hiện IDictionary<string, dynamic>
, bạn không thể cast đối tượng, thời gian. Nếu có, dàn diễn viên đơn giản qua (IDictionary<string, dynamic>)localVar
sẽ đủ.
Nếu không, có hai điều bạn có thể làm:
- Sao chép
IDictionary
để loại generic của bạn.
- Tạo một lớp Adapter chấp nhận
IDictionary
làm phụ thuộc và thực hiện các yêu cầu chung IDictionary
bạn muốn, ánh xạ cuộc gọi từ một đến người khác.
Edit: Các mẫu mã bạn vừa đăng tải sẽ sao chép các từ điển mỗi khi nó được gọi là! Tôi sẽ chỉnh sửa lại trong giây lát với một số mã được đề xuất.
Lựa chọn 1
cách tiếp cận mẫu mã của bạn là rắn như một phương tiện sao chép dữ liệu, nhưng các bản sao nên được lưu trữ hoặc bạn sẽ sao chép nhiều lần. Tôi khuyên bạn nên đặt mã dịch thực tế vào một phương thức riêng biệt và gọi nó từ tài sản của bạn lần đầu tiên nó được sử dụng. Ví dụ:
private IDictionary dataLayerProperties;
private IDictionary<string, dynamic> translatedProperties = null;
protected virtual IDictionary<string, dynamic> Properties
{
if(translatedProperties == null)
{
translatedProperties = TranslateDictionary(dataLayerProperties);
}
return translatedProperties;
}
public IDictionary<string, dynamic> TranslateDictionary(IDictionary values)
{
return values.Keys.Cast<string>().ToDictionary(key=>key, key => values[key] as dynamic);
}
Bây giờ, có những nhược điểm rõ ràng cho cách tiếp cận này ... nếu dataLayerProperties cần được làm mới thì sao? Bạn phải đi thiết translatedProperties null lần nữa, vv
Lựa chọn 2
Đây là phương pháp ưa thích của tôi.
public class TranslatedDictionary : IDictionary<string, dynamic>
{
private IDictionary Original = null;
public TranslatedDictionary(IDictionary original)
{
Original = original;
}
public ICollection<string> Keys
{
get
{
return Original.Keys.Cast<string>().ToList();
}
}
public dynamic this[string key]
{
get
{
return Original[key] as dynamic;
}
set
{
Original[key] = value;
}
}
// and so forth, for each method of IDictionary<string, dynamic>
}
//elsewhere, using your original property and field names:
Properties = new TranslatedDictionary(properties);
Giờ đây, có khuyết điểm rõ ràng để phương pháp này là tốt, những rõ ràng nhất là một thực tế rằng Keys
(và giá trị gia tăng và bất cứ điều gì khác mà trả ICollection
trên IDictionary
đã trở lại một mảng mới cho mỗi cuộc gọi. Nhưng này vẫn cho phép các cách tiếp cận linh hoạt nhất, vì nó đảm bảo dữ liệu luôn được cập nhật.
Mã mẫu mới của bạn sẽ sao chép dữ liệu trong IDictionary * mỗi lần được gọi là *. – Randolpho
cách duy nhất để được cập nhật –
Rất đúng. Tuy nhiên, bạn có thể thử tùy chọn mới được đề xuất của tôi 2. Mặc dù sẽ có bản sao nếu 'Keys' hoặc' Values' được gọi, nó sẽ luôn được cập nhật, trong khi dịch từ kiểu này sang kiểu khác. – Randolpho