คำถามติดแท็ก reflection

Reflection เป็นความสามารถของโปรแกรมในการสังเกตและ / หรือปรับเปลี่ยนโครงสร้างและ / หรือพฤติกรรมของมันที่รันไทม์ การสะท้อนแสงขึ้นอยู่กับภาษาการเขียนโปรแกรมที่สนับสนุน - โปรดติดแท็กภาษาการเขียนโปรแกรมที่ใช้เมื่อใช้แท็กนี้

10
ฉันจะตรวจสอบได้อย่างไรว่าคุณสมบัติมีอยู่ในประเภทที่ไม่ระบุตัวตนแบบไดนามิกใน c #
ฉันมีอ็อบเจ็กต์ประเภทไม่ระบุตัวตนที่ฉันได้รับเป็นไดนามิกจากวิธีการที่ฉันต้องการตรวจสอบคุณสมบัติที่มีอยู่ในอ็อบเจ็กต์นั้น .... var settings = new { Filename="temp.txt", Size=10 } ... function void Settings(dynamic settings) { var exists = IsSettingExist(settings,"Filename") } ฉันจะใช้ IsSettingExist ได้อย่างไร

1
การหลีกเลี่ยงข้อยกเว้นการจับคู่ที่คลุมเครือ
ฉันกำลังเรียกใช้วิธีการแบบคงที่แยกวิเคราะห์ประเภทผ่านการสะท้อนเพราะฉันไม่ทราบประเภทของวัตถุในเวลาคอมไพล์ (ฉันรู้ว่ามันมีวิธีการแยกวิเคราะห์โดยใช้สตริง) อย่างไรก็ตามฉันได้รับข้อยกเว้นการจับคู่ที่คลุมเครือซึ่งน่าจะเป็นเพราะมีวิธีการแยกวิเคราะห์ที่มากเกินไปซึ่งแต่ละวิธีใช้วัตถุชิ้นเดียว (สตริง, int, คู่ ฯลฯ ) ฉันจะเจาะจงมากขึ้นในการเรียกใช้เมธอดของฉันได้อย่างไรเพื่อให้แน่ใจว่าฉันไปถึงวิธีการที่ถูกต้อง ( แยกวิเคราะห์ (สตริง s) ) และข้อยกเว้นจะไม่ถูกโยนทิ้ง รหัสของฉันมีลักษณะดังนี้: Type returnType = p.PropertyType; object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });

8
ฉันสามารถเปลี่ยนฟิลด์แบบอ่านอย่างเดียวส่วนตัวใน C # โดยใช้การสะท้อนได้หรือไม่
ฉันสงสัยว่าเนื่องจากหลายสิ่งสามารถทำได้โดยใช้การสะท้อนแสงฉันสามารถเปลี่ยนฟิลด์ส่วนตัวแบบอ่านอย่างเดียวหลังจากที่ตัวสร้างเสร็จสิ้นการดำเนินการได้หรือไม่ (หมายเหตุ: แค่อยากรู้) public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } } Foo foo = new Foo(123); Console.WriteLine(foo.GetBar()); // display 123 // reflection code here... Console.WriteLine(foo.GetBar()); // display 456
115 c#  reflection  field  readonly 

18
การพิจารณาว่าออบเจ็กต์เป็นประเภทดั้งเดิมหรือไม่
ฉันมีObject[]อาร์เรย์และฉันกำลังพยายามค้นหาอาร์เรย์ที่เป็นแบบดั้งเดิม ผมเคยลองใช้Class.isPrimitive()แต่ดูเหมือนว่าฉันทำอะไรผิด: int i = 3; Object o = i; System.out.println(o.getClass().getName() + ", " + o.getClass().isPrimitive()); พิมพ์ java.lang.Integer, falseพิมพ์ มีวิธีที่ถูกต้องหรือทางเลือกอื่นหรือไม่?
114 java  reflection 

6
Swift รองรับการสะท้อนหรือไม่?
Swift รองรับการสะท้อนหรือไม่? เช่นมีบางอย่างเช่นvalueForKeyPath:และsetValue:forKeyPath:สำหรับวัตถุ Swift หรือไม่? จริงๆแล้วมันมีระบบประเภทไดนามิกobj.classหรือไม่เช่นใน Objective-C หรือไม่?
113 ios  reflection  swift 

8
วิธีโหลดแอสเซมบลีไปยัง AppDomain พร้อมการอ้างอิงทั้งหมดแบบวนซ้ำ
ฉันต้องการโหลดไปยังAppDomainแอสเซมบลีใหม่ซึ่งมีโครงสร้างอ้างอิงที่ซับซ้อน (MyDll.dll -> Microsoft.Office.Interop.Excel.dll -> Microsoft.Vbe.Interop.dll -> Office.dll -> stdole.dll) เท่าที่ฉันเข้าใจเมื่อกำลังโหลดแอสเซมบลีการAppDomainอ้างอิงจะไม่ถูกโหลดโดยอัตโนมัติและฉันต้องโหลดด้วยตนเอง ดังนั้นเมื่อฉันทำ: string dir = @"SomePath"; // different from AppDomain.CurrentDomain.BaseDirectory string path = System.IO.Path.Combine(dir, "MyDll.dll"); AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation; setup.ApplicationBase = dir; AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup); domain.Load(AssemblyName.GetAssemblyName(path)); และได้รับFileNotFoundException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'MyDll, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = …

3
เรียกวิธีการคงที่ด้วยการสะท้อน
ฉันมีคลาสคงที่หลายตัวในเนมสเปซmySolution.Macrosเช่น static class Indent{ public static void Run(){ // implementation } // other helper methods } ดังนั้นคำถามของฉันคือจะเรียกวิธีการเหล่านั้นด้วยการไตร่ตรองได้อย่างไร? หากวิธีการที่ไม่คงที่ฉันสามารถทำสิ่งต่อไปนี้: var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") ); foreach (var tempClass in macroClasses) { var curInsance = Activator.CreateInstance(tempClass); // I know have an instance of a macro and will be able to …
112 c#  reflection  dynamic 

3
ค้นหาไฟล์ PHP (ในขณะทำงาน) ที่มีการกำหนดคลาส
มีการไตร่ตรอง / วิปัสสนา / เวทมนตร์ใน PHP ที่จะช่วยให้คุณค้นหาไฟล์ PHP ที่กำหนดคลาส (หรือฟังก์ชัน) ไว้หรือไม่? กล่าวอีกนัยหนึ่งฉันมีชื่อของคลาส PHP หรืออ็อบเจ็กต์ที่สร้างอินสแตนซ์ ฉันต้องการส่งสิ่งนี้ไปยังบางสิ่ง (ฟังก์ชันคลาสการสะท้อนแสง ฯลฯ ) ที่จะส่งคืนเส้นทางระบบไฟล์ที่คลาสถูกกำหนดไว้ /path/to/class/definition.php ฉันรู้ว่าฉันสามารถใช้ ( get_included_files())เพื่อรับรายการไฟล์ทั้งหมดที่รวมไว้จนถึงตอนนี้แล้วแยกวิเคราะห์ทั้งหมดด้วยตนเอง แต่นั่นเป็นการเข้าถึงระบบไฟล์จำนวนมากสำหรับการพยายามครั้งเดียว ฉันยังตระหนักว่าฉันสามารถเขียนโค้ดเพิ่มเติมในกลไก __autoload ของเราที่เก็บข้อมูลนี้ไว้ที่ไหนสักแห่ง อย่างไรก็ตามการแก้ไข __autoload ที่มีอยู่นั้นไม่ได้มีข้อ จำกัด ในสถานการณ์ที่ฉันคิดไว้ การได้ยินเกี่ยวกับส่วนขยายที่สามารถทำสิ่งนี้ได้น่าสนใจ แต่สุดท้ายแล้วฉันก็ชอบสิ่งที่สามารถทำงานบนการติดตั้ง "สต็อค" ได้
111 php  reflection  class 

7
เข้าถึงเขตข้อมูลที่สืบทอดส่วนตัวผ่านการสะท้อนใน Java
ฉันพบวิธีรับสมาชิกที่สืบทอดผ่าน class.getDeclaredFields(); และเข้าถึงสมาชิกส่วนตัวผ่านclass.getFields() แต่ฉันกำลังมองหาเขตข้อมูลที่สืบทอดแบบส่วนตัว ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?

8
วิธีรับคุณสมบัติคงที่ด้วยการสะท้อนกลับ
ดูเหมือนจะค่อนข้างธรรมดา แต่ฉันไม่สามารถใช้งานได้ ฉันมีวัตถุและฉันใช้การสะท้อนเพื่อไปยังสมบัติสาธารณะ หนึ่งในคุณสมบัติเหล่านี้เป็นแบบคงที่และฉันไม่มีโชคที่จะได้รับมัน Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo Return obj.GetType.GetProperty(propName) End Function โค้ดด้านบนใช้งานได้ดีสำหรับคุณสมบัติอินสแตนซ์สาธารณะซึ่งจนถึงตอนนี้คือทั้งหมดที่ฉันต้องการ สมมติว่าฉันสามารถใช้ BindingFlags เพื่อขอคุณสมบัติประเภทอื่น ๆ ได้ (ส่วนตัวแบบคงที่) แต่ดูเหมือนจะไม่พบชุดค่าผสมที่เหมาะสม Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public) End Function แต่ถึงกระนั้นการร้องขอให้สมาชิก …
109 .net  reflection  static 

8
ฉันจะกำหนดประเภทของตัวแปรที่ประกาศโดยใช้ var ณ เวลาออกแบบได้อย่างน่าเชื่อถือได้อย่างไร
ฉันกำลังดำเนินการสิ่งอำนวยความสะดวก (Intellisense) สำหรับ C # ใน emacs แนวคิดคือถ้าผู้ใช้พิมพ์แฟรกเมนต์แล้วขอให้ดำเนินการเสร็จสิ้นโดยใช้การกดแป้นพิมพ์ร่วมกันสิ่งอำนวยความสะดวกในการทำให้เสร็จสมบูรณ์จะใช้การสะท้อน. NET เพื่อพิจารณาความสำเร็จที่เป็นไปได้ การทำเช่นนี้ต้องการให้ทราบประเภทของสิ่งที่จะเสร็จสมบูรณ์ หากเป็นสตริงจะมีชุดวิธีการและคุณสมบัติที่เป็นไปได้ ถ้าเป็น Int32 จะมีชุดแยกต่างหากและอื่น ๆ การใช้ความหมายแพคเกจรหัส lexer / parser ที่มีอยู่ใน emacs ฉันสามารถค้นหาการประกาศตัวแปรและประเภทของตัวแปรได้ ด้วยเหตุนี้จึงเป็นเรื่องง่ายที่จะใช้การสะท้อนเพื่อรับวิธีการและคุณสมบัติของประเภทจากนั้นจึงนำเสนอรายการตัวเลือกให้กับผู้ใช้ (โอเคไม่ตรงไปตรงมาที่จะทำภายใน emacs แต่การใช้ความสามารถในการเรียกใช้กระบวนการ powershell ภายใน emacsมันจะง่ายกว่ามากฉันเขียนแอสเซมบลี. NET ที่กำหนดเองเพื่อทำการสะท้อนโหลดลงใน powershell จากนั้น elisp ทำงานภายใน emacs สามารถส่งคำสั่งไปยัง powershell และอ่านการตอบกลับผ่าน comint ดังนั้น emacs จึงได้ผลลัพธ์ของการสะท้อนกลับอย่างรวดเร็ว) ปัญหามาถึงเมื่อรหัสใช้varในการประกาศสิ่งที่เสร็จสมบูรณ์ นั่นหมายความว่าไม่มีการระบุประเภทอย่างชัดเจนและการกรอกข้อมูลจะไม่ทำงาน ฉันจะกำหนดประเภทจริงที่ใช้อย่างน่าเชื่อถือได้อย่างไรเมื่อประกาศตัวแปรด้วยvarคีย์เวิร์ด เพื่อความชัดเจนฉันไม่จำเป็นต้องกำหนดตอนรันไทม์ ฉันต้องการตรวจสอบที่ "เวลาออกแบบ" …

2
ใช้ PropertyInfo เพื่อค้นหาประเภทคุณสมบัติ
ฉันต้องการแยกวิเคราะห์โครงสร้างวัตถุแบบไดนามิกเพื่อทำการตรวจสอบความถูกต้องที่กำหนดเอง การตรวจสอบความถูกต้องไม่สำคัญเช่นนี้ แต่ฉันต้องการเข้าใจคลาส PropertyInfo ให้ดีขึ้น ฉันจะทำอะไรแบบนี้ public bool ValidateData(object data) { foreach (PropertyInfo propertyInfo in data.GetType().GetProperties()) { if (the property is a string) { string value = propertyInfo.GetValue(data, null); if value is not OK { return false; } } } return true; } จริงๆส่วนเดียวที่ฉันสนใจในขณะนี้คือ 'ถ้าคุณสมบัติเป็นสตริง' ฉันจะค้นหาจากออบเจ็กต์ PropertyInfo ได้อย่างไรว่าเป็นประเภทใด ฉันจะต้องจัดการกับสิ่งพื้นฐานเช่นสตริง ints …
108 c#  .net  reflection 

15
การแปลงจำนวนเต็มเป็น Long
ฉันต้องการรับค่าของฟิลด์โดยใช้การสะท้อน มันเกิดขึ้นจนฉันไม่แน่ใจเสมอว่าประเภทข้อมูลของฟิลด์คืออะไร สำหรับสิ่งนั้นและเพื่อหลีกเลี่ยงการทำซ้ำรหัสบางอย่างฉันได้สร้างวิธีการต่อไปนี้: @SuppressWarnings("unchecked") private static <T> T getValueByReflection(VarInfo var, Class<?> classUnderTest, Object runtimeInstance) throws Throwable { Field f = classUnderTest.getDeclaredField(processFieldName(var)); f.setAccessible(true); T value = (T) f.get(runtimeInstance); return value; } และใช้วิธีนี้เช่น: Long value1 = getValueByReflection(inv.var1(), classUnderTest, runtimeInstance); หรือ Double[] value2 = getValueByReflection(inv.var2(), classUnderTest, runtimeInstance); ปัญหาคือดูเหมือนว่าฉันไม่สามารถส่งIntegerไปที่Long: java.lang.ClassCastException: java.lang.Integer cannot be cast …
108 java  reflection  casting 

3
ฉันจะตรวจสอบได้อย่างไรว่าวิธีการนั้นเป็นแบบคงที่โดยใช้การสะท้อน?
ฉันต้องการค้นพบเฉพาะวิธีการคงที่ของชั้นเรียนเท่านั้นฉันจะทำสิ่งนี้ได้อย่างไร หรือวิธีแยกความแตกต่างระหว่างวิธีการคงที่และไม่คงที่
107 java  reflection 

2
การใช้การสะท้อนคุณกำหนดค่าของฟิลด์โครงสร้างอย่างไร
มีเวลาคร่าวๆในการทำงานกับฟิลด์โครงสร้างโดยใช้reflectแพ็คเกจ โดยเฉพาะอย่างยิ่งยังไม่ได้หาวิธีตั้งค่าฟิลด์ พิมพ์ t struct {fi int; fs string} var rt = เสื้อ {123, "jblow"} var i64 int64 = 456 รับชื่อฟิลด์ i - ดูเหมือนจะใช้ได้ var field = reflect.TypeOf(r).Field(i).Name รับค่าของฟิลด์ i เป็น a) อินเทอร์เฟซ {}, b) int - ดูเหมือนจะใช้ได้ var iface interface{} = reflect.ValueOf(r).Field(i).Interface() var i int = int(reflect.ValueOf(r).Field(i).Int()) การตั้งค่าของฟิลด์ฉัน - …

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