2012-05-26 13 views
8

के रूप में एक प्रकार से पारित मैं इस तरह की कुछ वर्ग करना चाहते हैं:एक विशेषता तर्क

[XmlRoot(ElementName = typeof(T).Name + "List")] 
public class EntityListBase<T> where T : EntityBase, new() 
{ 
    [XmlElement(typeof(T).Name)] 
    public List<T> Items { get; set; } 
} 

लेकिन typeof (टी) तर्क नहीं विशेषता जा सकता है।

इसके बजाय मैं क्या कर सकता हूं?

उत्तर

4

आप XmlAttributeOverrides इस्तेमाल कर सकते हैं - लेकिन - कैश करने के लिए सावधान रहना होगा और serializer उदाहरण फिर से उपयोग करें:

static void Main() 
{ 
    var ser = SerializerCache<Foo>.Instance; 
    var list = new EntityListBase<Foo> { 
     Items = new List<Foo> { 
      new Foo { Bar = "abc" } 
    } }; 
    ser.Serialize(Console.Out, list); 
} 
static class SerializerCache<T> where T : EntityBase, new() 
{ 
    public static XmlSerializer Instance; 
    static SerializerCache() 
    { 
     var xao = new XmlAttributeOverrides(); 
     xao.Add(typeof(EntityListBase<T>), new XmlAttributes 
     { 
      XmlRoot = new XmlRootAttribute(typeof(T).Name + "List") 
     }); 
     xao.Add(typeof(EntityListBase<T>), "Items", new XmlAttributes 
     { 
      XmlElements = { new XmlElementAttribute(typeof(T).Name) } 
     }); 
     Instance = new XmlSerializer(typeof(EntityListBase<T>), xao); 
    } 
} 

(अगर आप कैश नहीं है और serializer उदाहरण फिर से उपयोग करें, यह विधानसभाओं का रिसाव हो जाएगा)

+0

ध्यान दें कि सामान्य वर्गों का उपयोग करके "स्थैतिक" बाईपास होगा। और कैश डेटा इस मामले में व्यावहारिक रूप से बेकार है। – Rzassar

+1

@Rzassar आप गलत हैं। जेनेरिक एक सरल तंत्र के रूप में बहुत जानबूझकर है o प्रति एक प्रकार/टी एक serializer है। XmlAttributeOverrides का उपयोग करते समय कैश *** आवश्यक *** है - जैसा कि मैंने समझाया है: अन्यथा आप असेंबली को रिसाव करेंगे। इस दृष्टिकोण से असेंबली ** एकत्र नहीं किया जा सकता **। यदि आप सरल रचनाकारों का उपयोग करते हैं, तो यह आंतरिक रूप से कैश करता है। लेकिन XmlSerializer के अधिक विदेशी कन्स्ट्रक्टर के साथ आप (कॉलर) को इसे संभालने की आवश्यकता है। –

संबंधित मुद्दे