@Nulltiton

Как в методе обратиться к полям наследуемого класса?

Хочу написать метод, в который будет передаваться экземпляр класса и название таблицы и в зависимости от этих параметров будет формироваться запрос на добавление записи в БД к выбранной таблице.

Есть класс Parent от которого наследуются классы tb и new_table. В классе CRUD есть заголовок метода добавления в БД Add:
public static bool Add(Parent instance, string tableName)

В этот метод кладется как параметр экземпляр класса tb или new_table. Например так:
tb c = new tb("", textBox1.Text);
CRUD.Add(c, "tb");

При попытке обратиться внутри метода к полям экземпляра класса tb под названием instance их просто не видно.
В классе Parent нет ничего, даже полей и в программе он нужен только для того, чтобы положить экземпляры разных классов как параметр функции.
Реализация класса tb:
public class tb : Parent
    {
        private string _id;
        private string _name;

        public string Id { get => _id; set => _id = value; }
        public string Name { get => _name; set => _name = value; }

        public tb(string id, string name) 
        {
            Id = id;
            Name = name;
        }
    }

Прошу подсказать:
1. Есть ли возможность как-то обратиться к полям наследуемого класса внутри метода?
2. Если такой возможности нет, то есть ли возможность передавать в метод разные экземпляры класса и что в таком случае должно быть в типе данных у экземпляра класса?

P.S. Вроде нашел способ обратиться к полям экземпляра класса через GetType().GetFields(), однако полученные поля в виде переменной объявленной через var никак не могу привести к типу лист или массив, поэтому бросил эту затею.

P.P.S Если не один из предложенных мной вариантов не является ответом на мой вопрос, то подскажите, куда следует копать. Думаю, что кто-нибудь уж точно задумывался над тем, чтобы реализовать что-то подобное, чтобы не писать для каждого класса отдельные CRUD-функционал. Если я не ошибаюсь, то нечто подобное есть в библиотеке для SQLite и там тоже есть единый метод Add, где нужно передать экземпляр класса и название таблицы.

Буду благодарен любой информации, спасибо
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ответы на вопрос 2
yarosroman
@yarosroman Куратор тега C#
C# the best
Для этого всего ORM и придумали.

Да и прочтите про наследование и виртуальные методы.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Как то так, тут 2 метода

public interface ISqlGenerator
    {
        string Generate();
    }
    public class Parent
    {
    }
    public class new_table : Parent, ISqlGenerator
    {
        public string Generate()
        {
            return "insert ....";
        }
    }
    public class tb : Parent, ISqlGenerator 
    {
        private string _id;
        private string _name;

        public string Id { get => _id; set => _id = value; }
        public string Name { get => _name; set => _name = value; }

        public tb(string id, string name)
        {
            Id = id;
            Name = name;
        }
        public string Generate()
        {
            return "insert ....";
        }
    }
    public class Crud {
        public static bool Add(Parent instance, string tableName)
        {
            if (instance is tb)
            {
                    var t = instance as tb;
            }
            else if (instance is new_table)
            {
                       var t = instance as new_table;
            }
            return false;
        }
        public static bool AddInterface(ISqlGenerator instance, string tableName) {
            var sql = instance.Generate();
            return false;
        }
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы