2012-02-18 2 views
0

У меня есть эта часть кода, которая работает нормально, Вопрос в том, хочу ли я добавить еще один элемент в xml с именем «Разрешить». Allow Element может получить значения «True» или «False». Я хочу, чтобы преобразовать его в логическое свойство в моем классе Plugin, то есть плагин будет иметь дополнительное свойство:Как преобразовать объекты в отражение

public bool Allow { get; set; } 

есть возможность преобразовать его?

Можете привести пример кода?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.IO; 
using System.Xml.Linq; 
using System.Reflection; 
using System.Text; 

namespace WindowsFormsApplication1 
{ 
    public abstract class Plugin 
    { 
     public string Type { get; set; } 
     public string Message { get; set; } 
    } 

    public class FilePlugin : Plugin 
    { 
     public string Path { get; set; } 
    } 

    public class RegsitryPlugin : Plugin 
    { 
     public string Key { get; set; } 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

    static class MyProgram 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      string xmlstr [email protected]" 
       <Client> 
        <Plugin Type=""FilePlugin""> 
        <Message>i am a file plugin</Message> 
        <Path>c:\</Path> 
        </Plugin> 
        <Plugin Type=""RegsitryPlugin""> 
        <Message>i am a registry plugin</Message> 
        <Key>HKLM\Software\Microsoft</Key> 
        <Name>Version</Name> 
        <Value>3.5</Value> 
        </Plugin> 
       </Client> 
       "; 

      Assembly asm = Assembly.GetExecutingAssembly(); 
      XDocument xDoc = XDocument.Load(new StringReader(xmlstr)); 
      Plugin[] plugins = xDoc.Descendants("Plugin") 
       .Select(plugin => 
       { 
        string typeName = plugin.Attribute("Type").Value; 
        var type = asm.GetTypes().Where(t => t.Name == typeName).First(); 
        Plugin p = Activator.CreateInstance(type) as Plugin; 
        p.Type = typeName; 
        foreach (var prop in plugin.Descendants()) 
        { 
         type.GetProperty(prop.Name.LocalName).SetValue(p, prop.Value, null); 
        } 

        return p; 
       }).ToArray(); 

      // 
      //"plugins" ready to use 
      // 
     } 
    } 
} 

ответ

2

изменение

foreach (var prop in plugin.Descendants()) 
{ 
    type.GetProperty(prop.Name.LocalName).SetValue(p, prop.Value, null); 
} 

в

foreach (var prop in plugin.Descendants()) 
{ 
    var pi = type.GetProperty(prop.Name.LocalName); 
    object newVal = Convert.ChangeType(prop.Value, pi.PropertyType); 
    pi.SetValue(p, newVal, null); 
} 

PS: использование <Allow>правда</Allow> не <Allow>Правда</Allow>

+0

Благодарим вас, пожалуйста, уточните, зачем использовать истину, а не истину? – user829174

+0

На самом деле, я думал, что этот оператор 'bool b = true' и написал его. Я не уверен на 100%. Возможно, True тоже будет работать. попробуйте и посмотрите. –

Смежные вопросы