2011-10-13 24 views
5

đưa vào mã bên dướiCách đặt từ điển của ExpandoObject là không phân biệt chữ hoa chữ thường?

dynamic e = new ExpandoObject(); 
var d = e as IDictionary<string, object>; 
for (int i = 0; i < rdr.FieldCount; i++) 
    d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]); 

Có cách nào để làm cho nó phân biệt dạng chữ để cho các tên trường Employee_name

e.Employee_name hoạt động giống cũng như e.employee_name

có doesn' t dường như là một cách rõ ràng, có lẽ là một hack?

Trả lời

4

Bạn có thể thanh toán Massive's triển khai MassiveExpando là đối tượng động không phân biệt chữ hoa chữ thường.

+0

Thú vị, không nhận thức được điều này, không được cập nhật vì feb sẽ xem xét sự khác biệt, cảm ơn! – Kumar

1

More như một sự tò mò hơn là một giải pháp:

dynamic e = new ExpandoObject(); 
var value = 1; 
var key = "Key"; 

var resul1 = RuntimeOps.ExpandoTrySetValue(
    e, 
    null, 
    -1, 
    value, 
    key, 
    true); // The last parameter is ignoreCase 

object value2; 
var result2 = RuntimeOps.ExpandoTryGetValue(
    e, 
    null, 
    -1, 
    key.ToLowerInvariant(), 
    true, 
    out value2); // The last parameter is ignoreCase 

RuntimeOps.ExpandoTryGetValue/ExpandoTrySetValue sử dụng phương pháp nội bộ của ExpandoObject rằng có thể kiểm soát sự nhạy cảm như vậy. Các thông số null, -1, được lấy từ giá trị sử dụng trong nội bởi ExpandoObject (RuntimeOps cuộc gọi trực tiếp các phương pháp nội bộ của ExpandoObject)

Hãy nhớ rằng các phương pháp đó là This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

+0

lỗi thời không biên dịch trong .net 4 http://msdn.microsoft.com/en-us/library/dd782193.aspx – Kumar

+0

@Kumar Tôi phải nói sự thật ... Vâng, tôi đã thử nghiệm mã trên Visual Studio 2010 và nó hoạt động. Chỉ cần để chắc chắn sáng nay tôi đã thử nghiệm nó một lần nữa và nó đã làm việc :-) Thú vị 'ExpandoTryGetValue' và' ExpandoTrySetValue' không được đánh dấu lỗi thời trên máy tính của tôi vì vậy tôi đã không nhận được bất kỳ cảnh báo. – xanatos

+0

hmm, thú vị, không chắc chắn những gì có thể khác ở đây! Tôi không thể biên dịch, vì vậy đã đi tìm câu trả lời và tìm thấy trang msdn! tôi có vs2010 cuối cùng sp1 trên xp sp3! không có bản beta hoặc bất cứ điều gì trên máy tính này hoặc là và không quen thuộc của một .net 4 sp1 hoặc xem trước hoặc là, bất kỳ suy nghĩ? – Kumar

0

công IDictionaryExtensionMethods lớp tĩnh
{
    public static void AddCaseInsensitive (từ điển IDictionary này, khóa chuỗi, giá trị đối tượng)
    {
        dictionary.Add (key.ToUpper(), value);
   }

    đối tượng public static Nhận (điều này điển IDictionary, chuỗi key)
    {
          trở lại từ điển [key.ToUpper()];
   }
}

0

Một giải pháp khác là tạo ra một lớp ExpandoObject -like bằng cách bắt nguồn từ System.Dynamic.DynamicObject và trọng TryGetValueTrySetValue.

+1

Xem [câu trả lời của tôi] (ví dụ http://stackoverflow.com/a/19354229/87453) cho một ví dụ –

7

Tôi đã sử dụng lớp này “ Flexpando ” (đối với expando linh hoạt) không phân biệt chữ hoa chữ thường.

Tương tự như Darin's MassiveExpando câu trả lời ở chỗ nó cung cấp cho bạn hỗ trợ từ điển, nhưng bằng cách hiển thị trường này như một trường, nó lưu phải triển khai 15 thành viên trở lên cho IDictionary.

public class Flexpando : DynamicObject { 
    public Dictionary<string, object> Dictionary 
     = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); 

    public override bool TrySetMember(SetMemberBinder binder, object value) { 
     Dictionary[binder.Name] = value; 
     return true; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) { 
     return Dictionary.TryGetValue(binder.Name, out result); 
    } 
} 
+2

Tôi thích sự đơn giản nhưng cảm thấy cần có nhiều quyền kiểm soát hơn đối với nội bộ . Có lẽ hai nhà xây dựng, một cái trống rỗng mặc định những gì bạn có ở đây và một IDictionary , hoặc constructor thiết lập trường Dictionary, mà tôi muốn thay đổi thành một thuộc tính công khai với một trình thiết lập riêng. –

Các vấn đề liên quan