Как узнать тип класса при чтении данных из файла? - PullRequest
0 голосов
/ 01 мая 2019

у меня 3 класса.«Продукт» является базовым классом.«Книга» и «Программное обеспечение» - это класс, который я наследую классу «Продукт».Сначала я записываю его в файл и хочу прочитать его обратно, чтобы узнать, является ли он классом «Книга» или «Программное обеспечение».Может ли кто-нибудь помочь мне, пожалуйста?

Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Windows.Forms;

namespace ProductMainten
{
    public class ProductDB
    {
        private const string dir = @"C:\C# 2012 Soben\Files\";
        private const string path = dir + "ProductsCh14.txt";

        public static List<Product> GetProducts()
        {
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);

            StreamReader textIn = new StreamReader(
                new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read));

            List<Product> products = new List<Product>();

            while (textIn.Peek() != -1)
            {
                string row = textIn.ReadLine();   
                string[] columns = row.Split('|');

                Product product = new Product();
                product.Code = columns[0];
                product.Description = columns[1];
                product.Price = Convert.ToDecimal(columns[2]);
                products.Add(product);
            }
            textIn.Close();
            return products;
        }

        public static void SaveProducts(List<Product> products)
        {
            StreamWriter textOut = new StreamWriter(
                new FileStream(path, FileMode.Append, FileAccess.Write));

            foreach (Product product in products)
            {
                if(product.GetType().Name == "Book")
                {
                    WriteBook((Book)product, textOut);
                }
                else if(product.GetType().Name == "Software")
                {
                    WriteSoftware((Software)product, textOut);
                }
            }
            textOut.Close();
        }

        private static void WriteBook(Book product, StreamWriter textOut)
        {
            WriteBase(product, textOut);
            textOut.Write(product.Author + "\n");
        }
        private static void WriteSoftware(Software product, StreamWriter textOut)
        {
            WriteBase(product, textOut);
            textOut.Write(product.Version + "\n");
        }
        private static void WriteBase(Product product, StreamWriter textOut)
        {
            textOut.Write(product.Code + "|");
            textOut.Write(product.Description + "|");
            textOut.Write(product.Price + "|");
        }

    }

}

Это код и для записи в файл, который в порядке

1 Ответ

0 голосов
/ 01 мая 2019

Невозможно определить тип из того, что я вижу, что вы делаете, вы пишете что-то вроде этого:

MyCode|MyDescription|MyPrice|MyAdditionalProperty

Невозможно определить тип по этой строке, если к свойствам унаследованных классов не наложены дополнительные правила.

Что вы можете сделать, это добавить эту информацию в качестве первого элемента:

textOut.Write(product.GetType() + "|"); // You can write a switch instead to write your own string instead of a full name

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

P.S. Я бы посоветовал заглянуть в некоторые стандартизированные библиотеки (или встроенные методы), чтобы выполнить сериализацию / десериализацию вместо того, чтобы писать ее самостоятельно, если только у вас нет для этого веской причины.

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