#c#
#c#
Вопрос:
Я пытаюсь создавать объекты динамически, но я не знаю, как это сделать. Что мне нужно, так это то, что у меня есть класс для этого объекта, а свойства объектов хранятся в базе данных. Затем мне нужно будет сравнить свойства каждого объекта, чтобы получить желаемый результат.
Итак, мне нужно динамически создавать объекты «на лету» со свойствами, загруженными из базы данных.
Комментарии:
1. У вас есть объектная модель, которую необходимо заполнить из базы данных, или вам нужны объекты, обладающие динамическими свойствами?
2. ДА. У меня есть объектная модель, которую необходимо заполнить из базы данных. Например, я создам 5 объектов, а затем сравню их свойства.
3. Не могли бы вы, пожалуйста, объяснить, с какими проблемами вы сталкиваетесь при этом? В чем конкретно заключаются проблемы?
Ответ №1:
Я не думаю, что вам нужно создавать объекты динамически, просто создайте один статически, который соответствует вашей схеме БД с подробными сведениями о свойствах, затем вы можете сравнить значения свойств по строкам или внутри экземпляра вашего объекта.
Комментарии:
1. Не могли бы вы, пожалуйста, привести мне пример?
Ответ №2:
Я работал над чем-то похожим на это. Есть несколько вещей:
- Включить
System.Reflection
пространство имен - Создайте объект динамически, используя
Activator
- Получите свойства объекта с помощью
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:
Вы могли бы использовать отражение для динамического построения своих объектов:
Ответ №8:
Я думаю, что вы хотите извлечь строки из базы данных и напрямую назначить их объекту, учитывая, что свойства объекта эквивалентны столбцам таблицы базы данных. Если это то, что вы имеете в виду, то я полагаю, что вы не можете 🙂
Ответ №9:
Роб Конери создал небольшой проект под названием Massive (сейчас поддерживается FransBouma), который в значительной степени выполняет то, что вы пытаетесь выполнить. По сути, это небольшой ORM, состоящий из 400 строк динамического кода C # 4.0.
Роб уже довольно давно занимается подобными вещами с SubSonic, так что вы можете найти его подход с Massive довольно интересным.
Комментарии:
1. Ссылки разорваны.