2013-04-24 2 views
1

Привет, Я пытаюсь создать общий синтаксический анализатор CSV в приложении Windows 8 с помощью C#. Я хочу, чтобы создать анализатор, в котором, когда я прохожу типа Т и строку CSV и объект, я должен получить объект заселен что-то вроде этого:Как создать объект класса из значений CSV?

T obj = ParserCSV<T>(CSVString); 

В настоящее время я могу получить образец, что там на MSDN ссылку для этого http://code.msdn.microsoft.com/CSV-Parser-for-WinRT-42e0f4d0

В этом случае мы анализируем строку csv и получаем коллекцию пары ключевых значений. Но затем для преобразования в объект нам нужно найти конкретный ключ и сопоставить его с объектом.

Как я могу это достичь?

+0

Вы можете только предположить, что значения CSV имеют строку типа. Если вы не кодируете сами значения CSV и не разбираете их по-разному для каждого требуемого типа, то то, что вы хотите, невозможно. Используйте XML. – MoonKnight

+0

Не удается сопоставить имя свойства с названием ключа? –

+0

Я вижу, что вы сейчас говорите, извините. Да, ты можешь это сделать. Дайте мне секунду, я попробую и помогу ... – MoonKnight

ответ

0

Посмотрите на метод Activator.CreateInstance; это создает экземпляр указанного типа, используя конструктор, который наилучшим образом соответствует указанным параметрам. Примером его использование в вашем случае будет

Activator.CreateInstance("myAssemblyName", "myType") 

Так что, если вы имели следующий класс

public class Person 
{ 
    private string _name; 
    public Person() { } 
    public Person(string name) 
    { 
     this._name = name; 
    } 
    public string Name 
    { 
     get { return this._name; } 
     set { this._name = value; } 
    } 
} 

Вы можете создать экземпляр объекта, используя что-то вроде следующего:

ObjectHandle handle = Activator.CreateInstance("PersonInfo", "Person"); 
Person p = (Person) handle.Unwrap(); 
p.Name = "Samuel"; 
Console.WriteLine(p); 

который напечатал бы «Самуил». В вашем случае для каждого KeyValuePair вы можете создать экземпляр соответствующего объекта, используя приведенное выше.

Надеюсь, это поможет.


Редактировать. Чтобы задать дополнительный вопрос.

Dictionary<String, String> someDict = new Dictionary<String, String>(); 
someDict = GetDictOfKvpFromCsv(); // Get the dictionary from your CSV. 
foreach (KeyValuePair<String, String> kvp in someDict) 
{ 
    ObjectHandle handle = Activator.CreateInstance(kvp.Key, kvp.Value); 
    ISomeType t = (ISomeType)handle.Unwrap(); 
    // Do other stuff... 
} 
+0

Спасибо, это действительно помогает. Но могу ли я взять свойство Name и передать его как строку в KeyValue Pair и получить значение для него? –

+0

Да. Но вы не показали, что такое «пара ключевых значений». это «KeyValuePair » или что? Пожалуйста, помните о том, чтобы повысить, если это было полезно и отметить как ответ, если это ответ ... – MoonKnight

+0

Да его пара KeyValuePair . –

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