Как динамически создавать объекты с помощью C #?

#c#

#c#

Вопрос:

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

Итак, мне нужно динамически создавать объекты «на лету» со свойствами, загруженными из базы данных.

Комментарии:

1. У вас есть объектная модель, которую необходимо заполнить из базы данных, или вам нужны объекты, обладающие динамическими свойствами?

2. ДА. У меня есть объектная модель, которую необходимо заполнить из базы данных. Например, я создам 5 объектов, а затем сравню их свойства.

3. Не могли бы вы, пожалуйста, объяснить, с какими проблемами вы сталкиваетесь при этом? В чем конкретно заключаются проблемы?

Ответ №1:

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

Комментарии:

1. Не могли бы вы, пожалуйста, привести мне пример?

Ответ №2:

Я работал над чем-то похожим на это. Есть несколько вещей:

  1. Включить System.Reflection пространство имен
  2. Создайте объект динамически, используя Activator
  3. Получите свойства объекта с помощью myObjectType.GetProperties() метода

Вот пример универсальной функции создания объектов с использованием вышеуказанных методов:

 using System.Reflection;

public static Item CreateItem<Item>(object[] constructorArgs, object[] propertyVals)
{
    //Get the object type
    Type t = typeof(Item);

    //Create object instance
    Item myItem = (Item)Activator.CreateInstance(t, constructorArgs);

    //Get and fill the properties
    PropertyInfo[] pInfoArr = t.GetProperties();
    for (int i = 0; i < pInfoArr.Length;   i)
        pInfo.SetValue(myItem, propertyVals[i], null); //The last argument is for indexed properties

    return myItem;
}
  

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

С помощью класса PropertyInfo вы можете получать свойства, получать имена свойств, получать атрибуты, связанные со свойствами, и т.д. Мощная технология. Вы должны быть в состоянии делать то, что вам нужно, с приведенной выше информацией, но если нет, дайте мне знать, и я добавлю больше информации.

Ответ №3:

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

 //database code goes here, results go in results
List<ClassName> l = new List<ClassName>()
foreach(Row r in results){
   l.Add(new ClassName(){ClassProperty1 = r.Property1,ClassProperty2 = r.Property2});
}
  

Ответ №4:

Вы говорите о Dictionary ?

 var dict=new Dictionary<string, string>();
dict.Add("property1", "val1");
dict.Add("property2", "val2");

var prop2val=dict["property2"];
  

Ответ №5:

Может быть, Activator — это то, что вы ищете?

http://msdn.microsoft.com/en-us/library/system.activator.aspx

Ответ №6:

Проверьте этот класс, скомпилируйте в реальном времени. Но его производительность не совсем хороша. http://msdn.microsoft.com/zh-cn/library/microsoft.csharp.csharpcodeprovider (VS.80).aspx

Ответ №7:

Вы могли бы использовать отражение для динамического построения своих объектов:

Ссылка на отражение msdn

Ответ №8:

Я думаю, что вы хотите извлечь строки из базы данных и напрямую назначить их объекту, учитывая, что свойства объекта эквивалентны столбцам таблицы базы данных. Если это то, что вы имеете в виду, то я полагаю, что вы не можете 🙂

Ответ №9:

Роб Конери создал небольшой проект под названием Massive (сейчас поддерживается FransBouma), который в значительной степени выполняет то, что вы пытаетесь выполнить. По сути, это небольшой ORM, состоящий из 400 строк динамического кода C # 4.0.

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

https://github.com/FransBouma/Massive

Комментарии:

1. Ссылки разорваны.