21
การสะท้อนชื่อพารามิเตอร์: การใช้ C # lambda หรือการใช้ไวยากรณ์ที่ไม่เหมาะสม?
ฉันกำลังดูส่วนประกอบของMvcContrib Grid และฉันก็รู้สึกทึ่ง แต่ในเวลาเดียวกันกลับกลายเป็นว่าเป็นกลอุบายที่ใช้ในไวยากรณ์ไวยากรณ์ : .Attributes(style => "width:100%") ไวยากรณ์ข้างต้นชุดแอตทริบิวต์รูปแบบของ HTML width:100%สร้างขึ้นเพื่อ ตอนนี้ถ้าคุณให้ความสนใจ 'สไตล์' ไม่ได้ระบุไว้ถูกอนุมานจากชื่อของพารามิเตอร์ในการแสดงออก! ฉันต้องขุดลงไปและพบว่ามี 'เวทมนตร์' เกิดขึ้น: Hash(params Func<object, TValue>[] hash) { foreach (var func in hash) { Add(func.Method.GetParameters()[0].Name, func(null)); } } ดังนั้นรหัสจึงใช้ชื่อทางการของพารามิเตอร์เพื่อสร้างพจนานุกรมของคู่ของค่าชื่อแอตทริบิวต์ โครงสร้างไวยากรณ์ที่ได้นั้นมีความหมายชัดเจนมาก แต่ในเวลาเดียวกันก็อันตรายมาก การใช้แลมบ์ดานิพจน์ทั่วไปช่วยให้สามารถแทนที่ชื่อที่ใช้โดยไม่มีผลข้างเคียง ผมเห็นตัวอย่างในหนังสือที่บอกว่าcollection.ForEach(book => Fire.Burn(book))ฉันรู้ว่าฉันสามารถเขียนในรหัสของฉันcollection.ForEach(log => Fire.Burn(log))และมันหมายถึงสิ่งเดียวกัน แต่ด้วยไวยากรณ์ MvcContrib Grid ที่นี่ทั้งหมดในทันทีฉันพบรหัสที่มีลักษณะและการตัดสินใจตามชื่อที่ฉันเลือกสำหรับตัวแปรของฉัน! ดังนั้นนี่คือการปฏิบัติร่วมกันกับชุมชน C # 3.5 / …