2014-09-05 2 views
0

Я сделал это:C# реализовать функцию о синхронизации пути

businessCRM.Description = 
    string.Format("{0}\n" + 
      "Name: {1}\n" + 
      "Street: {2}\n " + 
      "Number: {3}\n" + 
      "floor: {4}\n" + 
     business.Name, 
     business.Address.Street, 
     business.Address.Number, 
     business.Address.floor, 
); 

И я хотел бы сделать то же самое, но обратно в другом методе что-то вроде этого, чтобы сделать синхронизацию путь (туда и обратно):

business.Address.Street = businessCRM.Description; 
business.Address.Number = businessCRM.Description; 
business.Address.floor = businessCRM.Description; 

Но я не знаю, полностью ли это, любая идея?

+0

string.Format является используется совершенно неправильно. Где ваш формат? Более того, вы можете просто «invere» foramtted string. Вы должны сначала его обмануть. – 2014-09-05 06:58:09

+0

Во-первых, ваш 'string.Format' ошибочен, так как первым параметром является строка формата. Во-вторых: почему вы сливаете его, если вам нужно получить доступ к нему по отдельности? –

+0

Я обновил код, вы можете увидеть код, который у меня есть сейчас. – user1911

ответ

0

Реальное решение было бы поставить дополнительный Address элемент в вашем businessCRM классе, так что вы можете хранить данные и описании и не нужно, чтобы извлечь данные из описания позже. Разборки это только приведет к проблемам.

+0

Можете ли вы привести пример, пожалуйста? – user1911

+0

@ user1911 Пример невозможен без просмотра вашего кода. Вы никогда не давали объявление класса о том, что такое businessCRM. Опубликуйте больше кода, и я дам ему попробовать. – nvoigt

0

Вы можете разделить его на словарь, используя что-то вроде ниже; обратите внимание, я должен был спецтехникой случае в первой строке (не имеет префикса), и он не будет работать хорошо, если ваши данные включает в себя новые строки внутри в значениях:

var parts = new Dictionary<string, string>(
    StringComparer.InvariantCultureIgnoreCase); 
string firstLine; 
using(var reader = new StringReader(description)) 
{ 
    string line; 
    firstLine = reader.ReadLine(); 
    var splitBy = new[] { ':' }; 
    while ((line = reader.ReadLine()) != null) 
    { 
     var pair = line.Split(splitBy, 2, StringSplitOptions.None); 
     if (pair.Length == 2) parts[pair[0].Trim()] = pair[1].Trim(); 
    } 
} 
string tmp; 

string name, street, number, floor; // in your case, you could assign to 
            // the properties directly 
name = parts.TryGetValue("Name", out tmp) ? tmp : ""; 
street = parts.TryGetValue("Street", out tmp) ? tmp : ""; 
number = parts.TryGetValue("Number", out tmp) ? tmp : ""; 
floor = parts.TryGetValue("floor", out tmp) ? tmp : ""; 
+0

BTW: '// в вашем случае вы можете напрямую присваивать свойствам - неправильное - не можете использовать' out' с объектными свойствами, я имею в виду: 'myMethod (« Name », out myObj.Name)' - вызывает компиляцию временная ошибка. – 2014-09-05 07:34:34

+0

@p вы неправильно поняли; Я имею в виду «вместо переменных», т. Е. «Business.Address.Street = parts.TryGetValue (« Улица », out tmp)? tmp: ""; 'и т. д. –

+0

@NMarcGravell Ahh, мой плохой. – 2014-09-05 08:11:09

0

Прежде всего видят @Marc Gravell комментарий под вопросом - было бы намного легче справиться с десериализацией. Если нет, то это решение.

  1. мой код может быть медленным - вам нужно кэшировать отражения информации (например, информация об объекте коллекции)
  2. не существует никакой обработки ошибок и проверки (например, для недействительности - сделать это вручную;.))
  3. код предполагается, что вход всегда правильный вход (к новой линии символ внутри значения), формат и т.д.

Код:

var addressType = business.Address.GetType(); 

foreach (var line in businessCRM.Description 
           .Split(new[] { "\n", Environment.NewLine }, 
               StringSplitOptions.RemoveEmptyEntries)) 
{ 
    var propSelectorIndex = line.IndexOf(":"); 
    if (propSelectorIndex == -1) continue; 

    var propName = line.Subtring(0, propSelectorIndex); 
    var propInfo = addressType.GetProperties(BindigsFlag.Public 
                 | BindigsFlag.Instance) 
           .FirstOrDefault(prop => prop.Name == propName); 

    if (propInfo == null) throw new InvalidOperationException(); 

    var newPropValue = line.Substring(propSelectorIndex + 2); 
       // + 2 to omit : char and additional space 
    propInfo.SetValue(business.Address, newPropValue, null); 
} 
Смежные вопросы