เป็นไปได้หรือไม่ที่จะเพิ่มแอ็ตทริบิวต์ที่รันไทม์หรือเปลี่ยนค่าของแอททริบิวต์ที่รันไทม์?
เป็นไปได้หรือไม่ที่จะเพิ่มแอ็ตทริบิวต์ที่รันไทม์หรือเปลี่ยนค่าของแอททริบิวต์ที่รันไทม์?
คำตอบ:
แอตทริบิวต์เป็นข้อมูลเมตาแบบคงที่ แอสเซมบลีโมดูลชนิดสมาชิกพารามิเตอร์และค่าส่งคืนไม่ใช่วัตถุชั้นหนึ่งใน C # (เช่นSystem.Type
คลาสเป็นเพียงการแสดงชนิดของการสะท้อน) คุณสามารถรับอินสแตนซ์ของแอททริบิวต์สำหรับประเภทและเปลี่ยนคุณสมบัติได้หากพวกเขาสามารถเขียนได้ แต่จะไม่ส่งผลกระทบต่อแอททริบิวที่ใช้กับประเภทนั้น
สิ่งนี้ขึ้นอยู่กับสิ่งที่คุณพยายามจะทำให้สำเร็จ
System.ComponentModel.TypeDescriptorสิ่งที่สามารถนำมาใช้เพื่อเพิ่มแอตทริบิวต์ประเภทคุณสมบัติและกรณีวัตถุและมันก็มีข้อ จำกัด ที่คุณต้องใช้มันเพื่อดึงคุณสมบัติเหล่านั้นเช่นกัน หากคุณกำลังเขียนโค้ดที่ใช้คุณสมบัติเหล่านั้นและคุณสามารถใช้งานได้ภายในข้อ จำกัด เหล่านั้นฉันขอแนะนำอย่างแน่นอน
เท่าที่ฉันรู้ตัวควบคุม PropertyGrid และพื้นผิวการออกแบบสตูดิโอภาพเป็นสิ่งเดียวใน BCL ที่ใช้สิ่งที่ TypeDescriptor ในความเป็นจริงนั้นเป็นวิธีที่พวกเขาทำประมาณครึ่งสิ่งที่พวกเขาต้องทำจริงๆ
TypeDescriptor
และTypeDescriptionProvider
ไม่ได้ใช้งานหรือไม่)
[Attr(1), Attr(2), Attr(3)]
เฉพาะอดีต Attr(3)
คุณทำไม่ได้ วิธีแก้ปัญหาหนึ่งอาจเป็นการสร้างคลาสที่ได้รับเมื่อรันไทม์และเพิ่มแอ็ตทริบิวต์แม้ว่านี่อาจเป็น overkill เล็กน้อย
ก็แตกต่างกันฉันพบบทความที่อ้างอิงโดยใช้ Reflection. ทำเช่นนั้น
นี่คือลิงค์: http://www.codeproject.com/KB/cs/dotnetattributes.aspxคุณจะต้องการดูความคิดเห็นบางส่วนที่ด้านล่างของบทความเนื่องจากมีการพูดถึงแนวทางที่เป็นไปได้
YourClass
YourRuntimeClassWithAttributes
YourClass
คุณสามารถคลาสย่อยที่ runtime และสร้างคลาสที่เหมือนกันด้วยชื่อที่แตกต่างกันเล็กน้อยที่มีคุณสมบัติที่สร้างขึ้นแบบไดนามิกที่ต้องการและ polymorphism จะอนุญาตให้พิมพ์รหัสการตรวจสอบ baseclass ของคุณ
ไม่มันไม่ใช่.
แอตทริบิวต์เป็น meta-data และเก็บไว้ในรูปแบบไบนารีในแอสเซมบลีที่คอมไพล์ (นั่นเป็นเหตุผลว่าทำไมคุณสามารถใช้ประเภทแบบง่าย ๆ เท่านั้น)
ฉันไม่เชื่ออย่างนั้น แม้ว่าฉันผิดที่ดีที่สุดที่คุณสามารถหวังจะเพิ่มพวกเขาไปยังประเภททั้งไม่เคยอินสแตนซ์ของพิมพ์
หากคุณต้องการสิ่งที่จะสามารถเพิ่มแบบไดนามิกคุณสมบัติ c # ไม่ใช่วิธี ดูที่การจัดเก็บข้อมูลใน xml ฉันเพิ่งทำโครงการที่ฉันเริ่ม w / คุณลักษณะ แต่ในที่สุดก็ย้ายไปเป็นอนุกรม w / xml
ทำไมคุณต้อง แอ็ตทริบิวต์ให้ข้อมูลเพิ่มเติมสำหรับการสะท้อน แต่ถ้าคุณรู้จากภายนอกว่าต้องการคุณสมบัติใด
คุณสามารถเก็บข้อมูลเมตาจากภายนอกได้อย่างง่ายดายในฐานข้อมูลหรือไฟล์ทรัพยากร
ฉันพยายามอย่างหนักกับ System.ComponentModel.TypeDescriptor ไม่สำเร็จ ไม่ได้หมายความว่ามันใช้งานไม่ได้ แต่ฉันอยากเห็นโค้ดสำหรับเรื่องนั้น
ในส่วนที่เคาน์เตอร์ฉันต้องการเปลี่ยนค่าแอตทริบิวต์บางอย่าง ฉันทำหน้าที่ 2 อย่างที่ทำงานได้ดีสำหรับจุดประสงค์นั้น
// ************************************************************************
public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, description);
}
}
}
// ************************************************************************
public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, isReadOnly);
}
}
}
ในจาวาฉันใช้เพื่อหลีกเลี่ยงปัญหานี้โดยใช้แผนที่และการนำรหัสของฉันไปใช้
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
TypeDescriptor
-PropertyGrid
ไม่เพียง แต่