2016-03-20 4 views
1

Kann jemand helfen, wie abgeleitete Klassenobjekte Werte erhalten?C# asp mvc wie abgeleitete Klassenobjektwerte erhalten

Wenn ich versuche, von der abgeleiteten Klasse (Currency) in die Elternklasse (Entity) zu konvertieren, erhalte ich Nullen. Reale Werte von DB: http://prntscr.com/ahmy9h Null sind nach dem Entity Gießen: 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

Mögliches Duplikat von ["new" Modifikator bewirkt, dass Basisimplementierungen NULL-Eigenschaftswerte haben] (http://stackoverflow.com/questions/6239790/new-modifier-causes-base-implementations-to-have-null-property -Werte) – cokeman19

Antwort

1

würde ich ähnlich auffrischen auf der Differenz zwischen Erbschaft und Verstecken zu lesen this oder etwas vorschlagen. In Ihrem Fall teilt der Modifikator new in den Eigenschaften Currency.Id und Currency.Name dem Compiler mit, dass er diese Eigenschaften in der übergeordneten Klasse verbergen soll. Wenn Sie diese Eigenschaften in einer Currency-Instanz zuweisen, gelten diese Werte nur für diese Instanz als Instanz von Currency. Wenn Sie diese Instanz in eine Instanz von Entity umwandeln, sind Verweise auf diese Eigenschaften Verweise auf die Eigenschaften Entity (die Sie nicht festgelegt haben). Um das gewünschte Verhalten zu erhalten, sollten Sie den Modifikator virtual zu den Eigenschaftsdeklarationen in Entity hinzufügen und dann new in override in Currency ändern. Wenn Sie das Verhalten dieser Eigenschaften zwischen Currency und Entity nicht ändern, müssen Sie diese natürlich nicht in Currency überschreiben ... sie stehen allen Klassen zur Verfügung, die von Entity erben. Ich hoffe, das hilft.

+0

John, danke für schnelle Antwort. es funktionierte – Alexandr