BindingFlags.IgnoreCase ไม่ทำงานกับ Type.GetProperty ()?


183

ลองนึกภาพต่อไปนี้

ประเภท T มี บริษัท สาขา เมื่อรันวิธีการต่อไปนี้มันทำงานได้อย่างสมบูรณ์:

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

สายต่อไปนี้ฉันได้รับเป็นโมฆะ

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

ใครมีความคิดบ้าง


20
@OregonGhost: มันเป็นเรื่องสำคัญ?
leppie

9
ในขณะที่คำถามเมตาของคุณถูกต้อง แต่ก็ไม่สำคัญจริงๆ เป็นที่สุดของคำถามของฉันเหตุผลหลักของฉันคือความหิวความรู้;)
บอริส Callens

1
@leppie: ใช่มันเป็นเช่นนั้น อาจมีกรณีการใช้งานสำหรับสิ่งนี้ฉันไม่ทราบและเป็นที่น่าสนใจเสมอว่าทำไมผู้คนต้องการทำสิ่งต่าง ๆ
OregonGhost

21
@OregonGhost: ไม่ใช่ทุกภาษาที่กำหนดเป้าหมาย. Net เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่นั่นเป็นสาเหตุที่บางครั้งคุณต้องทำและค้นหาตัวพิมพ์เล็กและตัวพิมพ์เล็ก
Pop Catalin

2
ใช้เคสสำหรับฉัน: ดังนั้นฉันสามารถเปรียบเทียบวัตถุกับ MSSQL Compact Entity โดยไม่ต้องกังวลว่าพวกเขาจะพิมพ์ฟิลด์อย่างไร (ฉันกำลังเปรียบเทียบวัตถุกับฐานข้อมูลขนาดกะทัดรัดซึ่งบางฟิลด์เป็นชื่อ isSomething และ IsSomething) กล่าวอีกนัยหนึ่งเพื่อความเกียจคร้าน
teynon

คำตอบ:


389

คุณเขียนทับแฟล็กการค้นหาเริ่มต้นหากคุณระบุแฟล็กใหม่ที่คุณต้องระบุข้อมูลทั้งหมดเพื่อให้สามารถค้นหาคุณสมบัติได้ ตัวอย่างเช่น:BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance


7
ใครมีความคิดใด ๆ ว่าทำไมมันเป็นเช่นนี้ (ขอความรู้สาเก;)
Shrivallabh

2
@Shrivallabh BindingFlags.Public | BindingFlags.Instance เป็นค่าเริ่มต้นเมื่อคุณระบุชื่อคุณสมบัติเท่านั้น
Otabek Kholikov

1
@Shrivallabh การเพิ่มคำอธิบายของ OtabekKholikov ถ้าเป็นการรักษาค่าเริ่มต้นเหล่านี้และเพิ่ม (หรือ) ที่คุณระบุไว้BindingFlagsกับพวกเขาจะไม่มีทางที่จะไม่ใช้ค่าเริ่มต้น นั่นเป็นไปไม่ได้ที่จะยกเว้นPublicคุณสมบัติหรือยกเว้นInstanceคุณสมบัติ พวกเขาตัดสินใจว่าคุณจะใช้ค่าเริ่มต้นหรือแทนที่พวกเขาโดยการระบุสิ่งที่คุณต้องการ
xr280xr

36

คุณต้องเพิ่ม BindingFlags.Public | BindingFlags.Instance


2
คุณได้รับการโหวตน้อยลง แต่คุณเร็วขึ้น 2 นาที แต่อีกครั้งคำตอบของ Pop มีรายละเอียดเพิ่มเติม ฉันให้คะแนนทุกคนที่สมควรได้รับ! :)
Tony Basallo

10

ขอบคุณสิ่งนี้ช่วยฉันได้อย่างรวดเร็วในวันนี้ ฉันบันทึกข้อมูลการตรวจสอบแล้ว แต่มีการใส่ชื่อทรัพย์สินไม่ถูกต้อง (การตรวจสอบนั้นสร้างขึ้นในดาต้าเพลเยอร์) ดังนั้นฉันต้องเพิ่ม IgnoreCase เป็นธงผูกมัด แต่ก็ยังใช้งานไม่ได้จนกว่าเพื่อนร่วมงานของฉันจะพบคำตอบนี้ ฟังก์ชั่นที่เกิดขึ้น:

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 });
}

นี่เป็นส่วนหนึ่งของคลาสที่ฉันเรียกว่า DotMagic

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.