BindingFlags.IgnoreCase không hoạt động cho Type.GetProperty ()?


183

Hãy tưởng tượng như sau

Một loại T có một Công ty lĩnh vực. Khi thực hiện phương pháp sau, nó hoạt động hoàn hảo:

Type t = typeof(T);
t.GetProperty("Company")

Mặc dù cuộc gọi sau tôi nhận được null

Type t = typeof(T);
t.GetProperty("company", BindingFlags.IgnoreCase)

Bất cứ ai cũng có một ý tưởng?


20
@OrebGhost: Có vấn đề gì không?
leppie

9
Mặc dù câu hỏi meta của bạn là hợp lệ, nhưng nó thực sự không quan trọng. Như hầu hết các câu hỏi của tôi, lý do chính của tôi là sự khao khát kiến ​​thức;)
Boris Callens

1
@leppie: Vâng, đúng vậy. Có thể có một trường hợp sử dụng cho điều này tôi không biết, và nó luôn luôn thú vị tại sao mọi người muốn làm mọi thứ.
OregonGhost

21
@OrebGhost: không phải tất cả các ngôn ngữ nhắm mục tiêu .Net đều phân biệt chữ hoa chữ thường, đó là lý do tại sao đôi khi bạn cần phải làm và tìm kiếm trường hợp không nhạy cảm.
Pop Catalin

2
Trường hợp sử dụng cho tôi: Vì vậy, tôi có thể so sánh các đối tượng với Thực thể nhỏ gọn MSSQL mà không phải lo lắng về cách chúng nhập các trường. (Tôi đang so sánh một đối tượng với cơ sở dữ liệu nhỏ gọn trong đó một số trường có tên làS Something và IsS Something.) Nói cách khác, vì sự lười biếng.
teynon

Câu trả lời:


389

Bạn đã ghi đè các cờ tra cứu mặc định, nếu bạn chỉ định các cờ mới, bạn cần cung cấp tất cả thông tin để có thể tìm thấy thuộc tính. Ví dụ:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance


7
bất kỳ ai cũng có ý tưởng tại sao nó lại như thế này (hỏi về kiến ​​thức vì lợi ích;))
Shrivallabh

2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance là các cờ mặc định khi bạn chỉ cung cấp tên thuộc tính
Otabek Kholikov

1
@Shrivallabh Thêm vào lời giải thích của OtabekKholikov, nếu đó là để giữ các giá trị mặc định này và thêm (HOẶC) bạn đã chỉ định BindingFlagscho chúng, sẽ không có cách nào để không sử dụng mặc định. Tức là không thể loại trừ Publiccác thuộc tính hoặc loại trừ Instancecác thuộc tính. Họ quyết định bạn sẽ mặc định hoặc ghi đè chúng bằng cách chỉ định chính xác những gì bạn đang theo dõi.
xr280xr

36

Bạn cần phải thêm BindingFlags.Public | BindingFlags.Instance


2
Bạn nhận được ít phiếu bầu hơn, nhưng bạn đã nhanh hơn 2 phút - nhưng sau đó, câu trả lời của Pop có nhiều chi tiết hơn. Tôi cho phiếu cho tất cả những người xứng đáng! :)
Tony Basallo

10

Cảm ơn, điều này thực sự đã giúp tôi trong một nhúm ngày hôm nay. Tôi đã lưu thông tin kiểm toán, nhưng với tên không chính xác về tên tài sản. (Việc kiểm toán được tích hợp vào một datalayer.) Dù sao tôi cũng phải thêm IgnoreCase làm cờ ràng buộc, nhưng sau đó nó vẫn không hoạt động, cho đến khi đồng nghiệp của tôi tìm thấy câu trả lời này. Hàm kết quả:

public static void SetProperty(Object R, string propertyName, object value)
{
    Type type = R.GetType();
    object result;
    result = type.InvokeMember(
        propertyName, 
        BindingFlags.SetProperty | 
        BindingFlags.IgnoreCase | 
        BindingFlags.Public | 
        BindingFlags.Instance, 
        null, 
        R, 
        new object[] { value });
}

Đây là một phần của lớp tôi gọi là DotMagic.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.