2016-03-20 2 views
1

Может ли кто-нибудь помочь, как получить значения объектов объектов класса?C# asp mvc как получить значения объекта производного класса

Когда я пытаюсь сделать из производного класса (Currency) в родительский класс (Entity), я получаю null. Реальные значения из БД: http://prntscr.com/ahmy9h Null-х после отливки в Entity: http://prntscr.com/ahmxxo

public class Entity 
{ 
    public System.Guid Id { get; set; } 
    public string Name { get; set; } 
} 

public class Currency:Entity 
{ 
    public Currency() 
    { 
     this.BankServices = new HashSet<BankService>(); 
    } 

    public new System.Guid Id { get; set; } 
    public new string Name { get; set; } 

    public virtual ICollection<BankService> BankServices { get; set; } 
} 

public virtual IEnumerable<Entity> GetItems() 
{ 
    // check the cache 
    Dictionary<Guid, Entity> EntityData = GetCachedData(); 

    // If it's not in the cache, read it from the repository 
    if (EntityData == null) 
    { 
     // Get the data 
     Dictionary<Guid, Entity> EntityDataToCache = new Dictionary<Guid, Entity>(); 

     // get data from the repository 
     IEnumerable<Entity> entityDataFromDb = LoadData(); 
     foreach (var item in entityDataFromDb) 
     { 
      var itemValue = item; // ALL ZEROS http://prntscr.com/ahmxxo 
      var itemValue2 = (Currency)item; // REAL VALUES http://prntscr.com/ahmy9h 
      EntityDataToCache[(Guid)item.GetType().GetProperty("Id").GetValue(item, null)] = item; 
     } 

     if (EntityDataToCache.Any()) 
     { 
      // Put this data into the cache for 30 minutes 
      Cache.Set(CacheKey, EntityDataToCache, 30); 
     } 
    } 

    var cache = Cache.Get(CacheKey); 

    var result = cache as Dictionary<Guid, Entity>; 
    return result.Values; 
} 
+0

Возможный дубликат ["нового" модификатора приводит к тому, что базовые реализации имеют значения свойств NULL] (http://stackoverflow.com/questions/6239790/new-modifier-causes-base-implementations-to-have-null-property -значения) – cokeman19

ответ

1

Я хотел бы предложить чтение this или что-то подобное, чтобы освежить разницу между наследованием и скрываться. В вашем случае модификатор new на свойствах Currency.Id и Currency.Name сообщает компилятору скрыть эти свойства в родительском классе. Таким образом, когда вы назначаете эти свойства в экземпляре Currency, эти значения применимы только к этому экземпляру в качестве экземпляра Currency. Как вы видели из вашего кода, если вы передали этот экземпляр экземпляру Entity, ссылки на эти свойства являются ссылками на свойства Entity (которые вы еще не установили). Чтобы получить поведение, которое, как я думаю, вы ищете, вам нужно добавить модификатор virtual в объявления свойств в Entity, а затем изменить new на override в Currency. Конечно, если вы не изменяете поведение этих свойств между Currency и Entity, тогда вам не нужно переопределять их в Currency вообще ... они будут доступны для всех классов, которые наследуют от Entity. Надеюсь, это поможет.

+0

Джон, спасибо за быстрый ответ. это сработало – Alexandr