2010-06-03 14 views
11

मैं LINQ to CSV प्रोजेक्ट को चांदी की रोशनी (इसकी एक महान परियोजना) में उपयोग करने की कोशिश कर रहा हूं, क्योंकि इसका खुलासा हुआ है कि मुझे लगता है कि मैं सिर्फ चांदी की क्लास लाइब्रेरी के रूप में पुनः संकलित हो सकता हूं लेकिन दुर्भाग्यवश ऐसा लगता है कि यह सुविधा उपलब्ध नहीं है चांदी की रोशनी में TypeDescriptor.GetConverter विधि।चांदी की रोशनी टाइपडिस्क्रिप्टर.गेट कनवर्टर विकल्प

यह टाइप कन्वर्टर्स को उनके संबंधित सीएलआर प्रकारों में सीएसवी कॉलम को सही तरीके से पार्स करने के लिए इसका उपयोग करता है। मुझे Silverlight में काम करने के लिए linqtocsv स्रोतों में परिवर्तन करने में कोई समस्या नहीं है, लेकिन मुझे नहीं पता कि चांदी के प्रकाश में समकक्ष ऑपरेशन क्या होगा। विभिन्न Google खोजों ने मुझे इस page पर लाया है, लेकिन जो कुछ भी कहता है वह यह है कि एक्सएएमएल पार्सर के पास ऐसा करने का एक तरीका है (लेकिन यह नहीं कहता कि इस कार्यक्षमता को कैसे पहुंचाया जाए)।

संक्षेप में, सवाल यह है:

मैं TypeDescriptor.GetConverter की कार्यक्षमता कैसे दोहराने करते हैं?

मुझे जरूरी नहीं कि प्रतिस्थापन में एक सटीक गिरावट की आवश्यकता हो, मैं बस < ---> टाइपकॉन्टर संघों के समूह के हार्डकोड किए बिना ऐसा करने का एक अच्छा तरीका जानना चाहता हूं।

उत्तर

8

प्रकाश ढांचे पर आपके पास सीमित विकल्प हैं; मैं थोड़ी सी हार्ड कोडिंग से दूर नहीं जाऊंगा, खासकर यदि आपको केवल कोर प्रकारों का समर्थन करने की आवश्यकता है। यह पूर्ण TypeConverter विकल्प से भी सरल और तेज़ होगा। कुछ ऐसा:

static object Parse(Type type, string s) 
    { 
     switch (Type.GetTypeCode(type)) 
     { 
      case TypeCode.Boolean: return bool.Parse(s); 
      case TypeCode.Byte: return byte.Parse(s); 
      case TypeCode.Char: return s[0]; 
      case TypeCode.DateTime: return DateTime.Parse(s); 
       ... 
     } 
    } 
+0

धन्यवाद, मैं उम्मीद कर रही थी कि यह इस करने के लिए आ नहीं होगा, लेकिन मैं यह है कि एक सौदा ... – luke

1

मैंने इस मुद्दे को हल करने के लिए एक व्यापक टूलसेट बनाया है। वहाँ कई कदम शामिल हैं, लेकिन यहाँ यह है:

1) मूल मूल्य लौटें यदि लक्ष्य प्रकार मूल मूल्य 2) अन्यथा एक प्रकार कनवर्टर का निर्माण (यहाँ दिलचस्प भागों आते हैं)

public static TypeConverter GetTypeConverter(Type type) 
{ 
    TypeConverterAttribute attribute = (TypeConverterAttribute)Attribute.GetCustomAttribute(type, typeof(TypeConverterAttribute), false); 
    if (attribute != null) 
    { 
    try 
    { 
     var converterType = Type.GetType(attribute.ConverterTypeName, false); 
     if (converterType != null) 
     { 
     return (Activator.CreateInstance(converterType) as TypeConverter); 
} 
    } 
    catch {} 
    } 
    return new XamlStringConverter(type); 
    } 
से आबंटित है

यहां कुछ भी अद्भुत नहीं है। लेकिन अगर कोई कनवर्टर नहीं मिला तो XamlStringConverter वापस लौटा। यह चीजों को बदलने के लिए Xaml पार्सर का उपयोग करता है। प्रकार फ़ील्ड कनवर्टर में शामिल है, और इसमें कंस्ट्रक्टर को पास किया गया प्रकार शामिल है।

public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { 
     var strValue = value as string; 
     if (strValue != null) { 
      if (this.type == typeof(bool)) { 
       return bool.Parse(strValue); 
      } 
      if (this.type.IsEnum) { 
       return Enum.Parse(this.type, stringValue, false); 
      } 
      StringBuilder stringBuilder = new StringBuilder(); 
      stringBuilder.Append("<ContentControl xmlns='http://schemas.microsoft.com/client/2007' xmlns:c='" + ("clr-namespace:" + this.type.Namespace + ";assembly=" + this.type.Assembly.FullName.Split(new char[] { ',' })[0]) + "'>\n"); 
      stringBuilder.Append("<c:" + this.type.Name + ">\n"); 
      stringBuilder.Append(strValue); 
      stringBuilder.Append("</c:" + this.type.Name + ">\n"); 
      stringBuilder.Append("</ContentControl>"); 
      ContentControl instance = XamlReader.Load(stringBuilder.ToString()) as ContentControl; 
      if (instance != null) { 
       return instance.Content; 
      } 
     } 
     return base.ConvertFrom(context, culture, value); 
    } 
+0

सिवाय इसके कि एक महान समाधान की तरह दिखता है की बड़ी अपने नहीं लगता है कि [ऐसा नहीं ' टी काम] (http://rextester.com/runcode) बिल्कुल। मेरा लक्ष्य पूरी तरह से 'TypeDescriptor.GetConverter' विधि आदिम प्रकारों पर उपयोग किया जाना है। – Shimmy

+0

मैंने आपको कामकाजी कोड नहीं दिया: यह केवल कुछ स्निपेट है। उदाहरण के लिए, XamlStringConverter कक्षा परिभाषित नहीं है। क्या मुझे इसे पूर्ण श्रेणी कोड के साथ अपडेट करना चाहिए?यह वास्तव में जटिल नहीं है: XamlStringConverter क्लास, टाइप पैरामीटर वाला एक कन्स्ट्रक्टर बनाएं, और कन्स्ट्रक्टर द्वारा पॉप्युलेट किए गए एक प्रकार का फ़ील्ड बनाएं। बस इतना ही। (और जांचें कि मैंने टाइपो नहीं बनाया है।) – Eilistraee

+0

मुझे XamlStringConverter की आवश्यकता नहीं है, मैं बस एक deserialized स्ट्रिंग आउटपुट चाहता हूँ। वैसे भी, मैंने [समाधान bellow] (http://stackoverflow.com/a/9370752/75500) का उपयोग किया, मैंने टाइपकॉन्टर समाधान को प्राथमिकता दी क्योंकि यह अधिक सुरक्षित महसूस हुआ, लेकिन [वह] (http://stackoverflow.com/a/9370752/75500) समाधान काफी कम प्रदर्शन प्रभाव के लिए बहुत अच्छा काम करता प्रतीत होता है। – Shimmy

0

आप सुनिश्चित करें कि आप स्थिरता पर भरोसा कर सकते हैं, तो यह उपयोग करें:

private static object DeserializeValue(string value, Type type) 
{ 
    //uncomment if used with XML 
    //value = HttpUtility.HtmlDecode(value); 
    switch (Type.GetTypeCode(type)) 
    { 
    case TypeCode.Empty: 
     return null; 
    case TypeCode.DBNull: 
     return DBNull.Value; 
    case TypeCode.Object: 
     throw new InvalidCastException(
     string.Format("The type '{0}' is not supported.", type)); 
    case TypeCode.String: 
     return value; 
    default: 
     { 
     var convertible = value as IConvertible; 
     return convertible.ToType(type, CultureInfo.InvariantCulture); 
     } 
    } 
} 

सुनिश्चित करें कि आपके क्रमबद्धता समारोह स्थिरता के लिए अक्रमांकन रूप में एक ही संस्कृति है:

private static string SerializeValue(object value) 
{ 
    if (!(value is IConvertible)) 
    throw new InvalidCastException(
     string.Format("The type '{0}' is not supported.", value.GetType())); 
    var convertible = (IConvertible)value; 
    var str = convertible.ToString(CultureInfo.InvariantCulture); 
    //uncomment if you're serializing to XML 
    //return HttpUtility.HtmlEncode(str); 
    return str; 
} 

ध्यान दें कि केवल आदिम प्रकार समर्थित हैं।

0

से: http://lostechies.com/jimmybogard/2010/02/19/automapper-for-silverlight-3-0-alpha/

private static TypeConverter GetTypeConverter(Type type) 
{ 
    var attributes = type.GetCustomAttributes(typeof(TypeConverterAttribute), false); 

    if (attributes.Length != 1) 
     return new TypeConverter(); 

    var converterAttribute = (TypeConverterAttribute)attributes[0]; 
    var converterType = Type.GetType(converterAttribute.ConverterTypeName); 

    if (converterType == null) 
     return new TypeConverter(); 

    return Activator.CreateInstance(converterType) as TypeConverter; 
} 
संबंधित मुद्दे