Динамически читаемый класс - PullRequest
0 голосов
/ 15 октября 2018

поэтому я наткнулся на создание нескольких программ, которые создают конкретные XML-файлы с данными из базы данных.

Теперь я хотел бы создать приложение, которое я мог бы просто повесить на структурированный класс со значениями, и он мог быдинамически читать его.

Моя идея этого класса примерно такая:

public class Order
{
    public string PO_NO { get; set; }
    ................
    public List<OrderDetails> OrderDetails = new List<OrderDetails>();
}

, и XML будет выглядеть следующим образом

<ORDER>

<PO_NO>18060001</PO_NO>
....
   -<ORDER_DETAILS>

      -<ORDER_DETAIL>
      </ORDER_DETAIL>     
      -<ORDER_DETAIL>
      </ORDER_DETAIL>
    ...
   </ORDER_DETAILS>
-</ORDER>

Я надеюсь, что это охватываетструктура и идея.

До сих пор я борюсь с динамическим чтением класса.

Последняя и, к сожалению, самая близкая попытка заключается в следующем:

foreach (var refer in DatabaseData.getRefs()) //just gets reference numbers for me, for further reading
            {
//THIS one returns the filled class. Eg. the Order class explained higher.
                var MyClass = DatabaseData.read(refer); 
                var fiel = DatabaseData.read(refer).GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
                foreach (var field in fiel)
                {
                    var fieldName = field.Name.Replace('<', ' ').Replace('>', ' ').Replace("__", null).Replace("kBackingField", null);

                    if (field.FieldType.ToString().Contains("List"))
                        Debug.WriteLine("its a list");
                    else
                        Debug.WriteLine((string)DatabaseData.read(refer).GetType().GetField(fieldName).GetValue(Activator.CreateInstance(DatabaseData.read(refer).GetType())));
                }
            }

Это та часть, которая беспокоит меня,Я пробовал много вариантов этого, я нашел на форумах, но я все еще получаю.Ссылка на объект не установлена ​​на экземпляр объекта.

(string)DatabaseData.read(refer).GetType().GetField(fieldName).GetValue(Activator.CreateInstance(DatabaseData.read(refer).GetType()))

Есть идеи, пожалуйста?Или укажите мне правильный путь.

Заранее спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

Здесь не нужно ничего делать самостоятельно;просто используйте XmlSerializer.

Возможно, вам понадобится добавить некоторые атрибуты, чтобы получить желаемый XML:

[XmlRoot("ORDER")]
public class Order
{
    [XmlElement("PO_NO")] // note this one is implicit and not strictly needed
    public string PO_NO { get; set; }
    [XmlArray("ORDER_DETAILS")]
    [XmlArrayItem("ORDER_DETAIL")]
    public List<OrderDetails> OrderDetails {get;} = new List<OrderDetails>();
}

затем:

var serializer = new XmlSerializer(typeof(Order));

Нечто это имеет значение, как только вы это сделаете, но в этом случае также необходимо использовать информацию о поле поддержки Roslyn - просто посмотрите на GetProperties() и GetFields(), и при необходимости используйте PropertyInfo.SetValue(...) вместо FieldInfo.SetValue(...);значение: используйте свойство, а не вспомогательное поле.

...