มีวิธีใดที่ nameof โอเปอเรเตอร์จะเข้าถึงพารามิเตอร์ของวิธีการ (นอกเหนือจากวิธีการเดียวกัน) หรือไม่?

เข้าชั้นเรียนและวิธีการต่อไปนี้:

public class Foo
    public Foo Create(string bar) {
        return new Foo(bar);
    }

ดังนั้นการ "สร้าง" จึงชัดเจน: nameof(Foo.Create)

มีวิธีใดบ้างที่จะได้ "บาร์" นอกเหนือจากการใช้การสะท้อนกลับเพื่ออ่านพารามิเตอร์ ณ รันไทม์?


person Chris Marisic    schedule 20.05.2016    source แหล่งที่มา
comment
แค่อยากรู้ว่าทำไมคุณถึงต้องการสิ่งนั้น?   -  person Paulo Morgado    schedule 21.05.2016
comment
@PauloMorgado ฉันกำลังส่ง json โดยตรงผ่านระบบของฉันโดยพิมพ์ให้น้อยที่สุดเท่าที่จะทำได้ ฉันชอบที่ในการทดสอบของฉัน ฉันสามารถระบุความสัมพันธ์ระหว่างคุณสมบัติและชื่อ json ได้อย่างง่ายดาย................................ $"{nameof(Person.Name)}:chris, foo:bar" (ฉันอยู่ในช่องแสดงความคิดเห็น นี่ไม่ใช่การคัดลอกและวางตามตัวอักษร แต่เป็นแนวคิดทั่วไป) เป็นการยากที่จะแสดงความสัมพันธ์ระหว่างคู่คุณสมบัติชื่อ & ค่าของ json และความสัมพันธ์กับคู่ชื่อและประเภทของอาร์กิวเมนต์ของวิธีการ ฉันเบื่อกับเลเยอร์การแมปที่ไม่มีวันสิ้นสุดเมื่อสิ่งที่ฉันต้องการคืออินพุตโดยตรง   -  person Chris Marisic    schedule 23.05.2016
comment
@PauloMorgado กรณีหนึ่งที่มีประโยชน์มากคือ Bootstrapping คอนเทนเนอร์ IoC เช่น Ninject's WithConstructorArgument รับชื่อพารามิเตอร์ตัวอักษรสตริงที่สะท้อน - การเปลี่ยนแปลงใด ๆ ลายเซ็นวิธีการและบูม! การบูตสแตรปแตก คงจะเหมาะมากที่จะใช้ nameof(Class.Method.Parameter) แทน   -  person StuartLC    schedule 02.11.2017


คำตอบ (1)


ไม่ ไม่มีวิธีรับชื่อพารามิเตอร์จากภายนอกเมธอดโดยใช้ nameof nameof ใช้งานไม่ได้กับพารามิเตอร์ของเมธอด หากคุณต้องการให้ชื่ออยู่ฝั่งการโทร (สำหรับผู้โทร เห็นได้ชัดว่าใช้งานได้) วิธีการอื่นๆ ที่คุณกล่าวถึง เช่น การสะท้อนกลับ ได้ผล

var parameterNames = typeof(Program)
                     .GetMethod(nameof(Program.Main)).GetParameters()
                     .Select(p => p.Name);
person Patrick Hofman    schedule 20.05.2016
comment
ประโยคนี้ไม่ถูกต้อง: nameof ใช้ไม่ได้กับพารามิเตอร์เมธอด nameof ใช้งานได้กับพารามิเตอร์ แต่ภายในขอบเขตของพารามิเตอร์เท่านั้น - person Ian Newson; 14.11.2016
comment
ใช่จริง ปรับปรุงนิดหน่อย. หากคุณมีข้อเสนอแนะที่ดีกว่า ยินดีต้อนรับ @IanNewson - person Patrick Hofman; 14.11.2016