c# asp mvc 如何获取派生的 class 对象值

c# asp mvc how to get derived class object values

任何人都可以帮助如何获得派生的 class 对象值吗?

当我尝试从派生 class(货币)转换为父 class(实体)时,我得到了空值。 来自数据库的实际值:http://prntscr.com/ahmy9h 转换为实体后为空: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;
}

我建议阅读 this 或类似的东西以复习继承和隐藏之间的区别。在您的例子中,Currency.IdCurrency.Name 属性上的 new 修饰符告诉编译器将这些属性隐藏在父 class 中。因此,当您在 Currency 实例中分配这些属性时,这些值仅适用于作为 Currency 实例的该实例。正如您从代码中看到的那样,如果将该实例转换为 Entity 的实例,对这些属性的引用就是对 Entity 属性(您尚未设置)的引用。为了获得我认为您正在寻找的行为,您需要将 virtual 修饰符添加到 Entity 中的 属性 声明,然后将 new 更改为overrideCurrency 中。当然,如果您不在 CurrencyEntity 之间更改这些属性的行为,那么您根本不需要在 Currency 中覆盖它们……它们将是对继承自 Entity 的所有 class 可用。希望对您有所帮助。