2014-12-15 2 views
0

EDIT:Loading Значение ключа пары на C# класс

Хранимая процедура возвращает следующие данные:

| Name | Value | 
|---------|-----------| 
| Member1 | someValue | 
| Member2 | someValue | 

И у меня есть класс, который со свойствами, которые имеют пользовательский атрибут, который соответствует " Название»поле в базе данных

class example{ 
    [CustomMapping(DBName="Member1",...)] 
    public string MyName1{get; set;} 

    [CustomMapping(DBName="Member2",...)] 
    public int MyName2{get; set;} 
} 

И у меня есть следующий метод, чтобы заполнить класс из БД:

public void LoadFromDataReader(IDataReader reader) 
{ 
     Type type = this.GetType(); 
     PropertyInfo[] props = type.GetProperties(); 

     foreach (PropertyInfo property in props) 
     { 
      CustomMappingAttribute mappingAttribute = (CustomMappingAttribute)Attribute.GetCustomAttribute(property, typeof(CustomMappingAttribute)); 

      object val = null; 

      if (property.GetType() == typeof(string)) 
      { 
       val = CustomObjectData.SafeRead<string>(mappingAttribute.DBName, reader, string.Empty); 
      } 
      else 
      { 
       val = CustomObjectData.SafeRead<int>(mappingAttribute.DBName, reader, int.MinValue); 
      } 

      property.SetValue(property, val); 
     } 
} 

Я хочу присвоить каждому свойству соответствующее значение из БД. Приведенный выше код не будет делать это точно, поскольку он будет перезаписывать какое-либо свойство каждый раз, когда вызывается LoadFromDataReader() из-за цикла for.

Как мне это сделать?

FYI: CustomObjectData.SafeRead читает FIELDNAME из БД и присваивает его свойству.

SafeRead<T>(string fieldName, IDataReader reader, T defaultValue); 

.

.

.

.

.

Старый Вопрос:

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

Хранимая процедура возвращает следующие данные:

| Name | Value | 
|---------|-----------| 
| Member1 | someValue | 
| Member2 | someValue | 

Теперь я хочу, чтобы мой класс, чтобы иметь следующую структуру чтения/загруженное из хранимой процедуры:

class example{ 

    public string Member1{get; set;} 
    public string Member2{get; set;} 
} 

Там всегда будет строка и хранимая процедура может вернуть любое количество пар ключ/значение.

Возможно ли это? Есть ли лучший способ сделать это?

Я хочу сделать это, потому что я буду сериализовать этот класс в JSON. И это становится тривиальным, если я правильно структурировал класс.

+2

Да, это определенно возможно несколькими способами. Сколько вы читали о доступе к базе данных в .NET? Вы уже используете LINQ? –

+0

Вы можете использовать [ExpandoObject] (http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject (v = vs.100) .aspx), но я бы не рекомендовал это делать , Почему бы вам не использовать простой «Список »? Он может быть легко (де-) сериализован. – dymanoid

+1

@stackErr LINQ относится ко всему ;-) – Murven

ответ

0

Я думаю, что вы можете сделать что-то вроде

public class Example 
    { 
     public IEnumerable<string> Members { get; set; } 
    } 

Если все они являются строкой, вы можете использовать что-то вроде этого, если нет, то вы можете использовать T для того, чтобы сделать это родовое.

Надеюсь, это поможет

Смежные вопросы