Как заполнить таблицу Sql с помощью общего метода отражения? - PullRequest
1 голос
/ 19 апреля 2011

Привет; У меня есть 4 таблицы, одна из которых является основной таблицей, и между таблицами существует отношение один ко многим. TID - это внешний ключ, а ID - это PK. В следствии. я не хочу заполнять таблицу классическим методом. Я должен получить доступ к свойству таблицы и общие я хочу установить все TID в T_Table, C_Table, Q_Table

enter image description here

МОИ КОДЫ (это тестовый проект, а не реальный проект, но логистика такая же, как и у реального проекта) Ниже коды возвращаются мне ОШИБКА (в первом цикле foreach): Исключение нулевой ссылки; Ссылка на объект не установлена ​​для экземпляра объекта.


    using System.Reflection;

    namespace App.ReflectionToGeneric
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] PropertyNames = new string[] { "TID", "AnyID" };
                int[] Vals = new int[] { 1, 2 };
                new DataManager().Save<QTable>(PropertyNames, Vals);
            }
        }


        public class DataManager
        {
            IEnumerable<Table> list = new GetData().GetVals();
            public void Save<TModel>( string[] PropertyNames, int[] Vals ) where TModel : class, new()
            {

                var instance = new TModel();
                Type calcType = instance.GetType();
               // object calcInstance = Activator.CreateInstance(calcType);
                foreach (string PropertyName in PropertyNames)
                {
                    // ERROR RETURN TO ME BELOW   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                    calcType.GetProperty(PropertyName).SetValue(instance, Vals[0], null);
                }
                foreach (string PropertyName in PropertyNames)
                {
                    Console.WriteLine(calcType.GetProperty(PropertyName).GetValue(instance, null).ToString());
                }

            }
       }

        public class GetData
        {
            public IEnumerable<Table> GetVals()
            {
                List<Table> list = new List<Table>();
                list.Add(new Table() { ID = 1, Name = "yusuf" });
                list.Add(new Table() { ID = 2, Name = "berkay" });
                return list;
            }
        }

        public class Table
        {
            internal int ID { get; set; }
            internal string Name { get; set; }
        }

        public class CTable
        {
            internal int ID { get; set; }
            internal int TID { get; set; }
            internal int AnyID { get; set; }
        }

        public class QTable
        {
            internal int ID { get; set; }
            internal int TID { get; set; }
            internal int AnyID { get; set; }
        }

        public class TTable
        {
            internal int ID { get; set; }
            internal int TID { get; set; }
            internal int AnyID { get; set; }
        }
    }

1 Ответ

1 голос
/ 20 апреля 2011

Похоже, проблема в том, что свойства не являются общедоступными, поэтому GetProperty("AnyID") и т. Д. Вернут null. Чтобы получить непубличные свойства, вам нужны флаги привязки:

calcType.GetProperty(PropertyName, BindingFlags.Instance|BindingFlags.NonPublic)

Вы также можете захотеть зациклить что-то вроде dapper , которое сделает связывание для вас, и намного быстрее (оно предварительно генерирует IL через API emit, а не для каждого элемента / per отражение члена).

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