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.Id
和 Currency.Name
属性上的 new
修饰符告诉编译器将这些属性隐藏在父 class 中。因此,当您在 Currency
实例中分配这些属性时,这些值仅适用于作为 Currency
实例的该实例。正如您从代码中看到的那样,如果将该实例转换为 Entity
的实例,对这些属性的引用就是对 Entity
属性(您尚未设置)的引用。为了获得我认为您正在寻找的行为,您需要将 virtual
修饰符添加到 Entity
中的 属性 声明,然后将 new
更改为override
在 Currency
中。当然,如果您不在 Currency
和 Entity
之间更改这些属性的行为,那么您根本不需要在 Currency
中覆盖它们……它们将是对继承自 Entity
的所有 class 可用。希望对您有所帮助。
任何人都可以帮助如何获得派生的 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.Id
和 Currency.Name
属性上的 new
修饰符告诉编译器将这些属性隐藏在父 class 中。因此,当您在 Currency
实例中分配这些属性时,这些值仅适用于作为 Currency
实例的该实例。正如您从代码中看到的那样,如果将该实例转换为 Entity
的实例,对这些属性的引用就是对 Entity
属性(您尚未设置)的引用。为了获得我认为您正在寻找的行为,您需要将 virtual
修饰符添加到 Entity
中的 属性 声明,然后将 new
更改为override
在 Currency
中。当然,如果您不在 Currency
和 Entity
之间更改这些属性的行为,那么您根本不需要在 Currency
中覆盖它们……它们将是对继承自 Entity
的所有 class 可用。希望对您有所帮助。