泛型 类 及其子项
Generic classes and its child
我有基础 class 实体和继承 class 说家,
public class Home : Entity
{
public int CityId{get;set;}
}
public class Town : Entity
{
public int CityId {get;set}
public Home CityHall {get;set;}
public List<Home > Homes{get;set;}
}
我想为 Town 及其子项设置 CityId
所以第一次尝试我做了以下
public class DataAccessBase<T> where T : Entity
{
public int Add(T entity)
{
Type t = typeof(T);
PropertyInfo prop = t.GetProperty("CityId");
if (prop != null)
{
prop.SetValue(entity, 2);
}
}
}
这仅适用于父如何访问子项,我想一般地这样做只是因为我有一个数据访问层,它通常插入数据库
看起来有两个不相关的问题
如果 属性 存在,如何在不知道的情况下设置对象的 属性:反射就可以解决这个问题。请注意,这不是非常 C# 的方式 - 您将使用一些接口并将泛型限制为该接口以允许对属性进行强类型访问。
如何在不知道类型的情况下枚举 "child" 对象:再次传统的解决方案是为 "GetChildren" 功能添加接口。或者,您可以使用反射找到所有 "child" 类型的属性,并与所有 IEnumerable<"child type">
类型的属性组合。
如果你可以使用一些约定 dynamic
可以更容易地替代反射(即每个类型都公开 Children
属性 来枚举它们:
dynamic town = GetTown();
foreach(dynamic child in town.Children) {...}
无需反射,直接设置属性即可
entity.CityId = 1;
if(entity is Town) {
var town = entity as Town;
if(town.Homes!=null) {
town.Homes.ForEach(t=> t.CityId = entity.CityId);
}
}
我有基础 class 实体和继承 class 说家,
public class Home : Entity
{
public int CityId{get;set;}
}
public class Town : Entity
{
public int CityId {get;set}
public Home CityHall {get;set;}
public List<Home > Homes{get;set;}
}
我想为 Town 及其子项设置 CityId 所以第一次尝试我做了以下
public class DataAccessBase<T> where T : Entity
{
public int Add(T entity)
{
Type t = typeof(T);
PropertyInfo prop = t.GetProperty("CityId");
if (prop != null)
{
prop.SetValue(entity, 2);
}
}
}
这仅适用于父如何访问子项,我想一般地这样做只是因为我有一个数据访问层,它通常插入数据库
看起来有两个不相关的问题
如果 属性 存在,如何在不知道的情况下设置对象的 属性:反射就可以解决这个问题。请注意,这不是非常 C# 的方式 - 您将使用一些接口并将泛型限制为该接口以允许对属性进行强类型访问。
如何在不知道类型的情况下枚举 "child" 对象:再次传统的解决方案是为 "GetChildren" 功能添加接口。或者,您可以使用反射找到所有 "child" 类型的属性,并与所有
IEnumerable<"child type">
类型的属性组合。如果你可以使用一些约定
dynamic
可以更容易地替代反射(即每个类型都公开Children
属性 来枚举它们:dynamic town = GetTown(); foreach(dynamic child in town.Children) {...}
无需反射,直接设置属性即可
entity.CityId = 1;
if(entity is Town) {
var town = entity as Town;
if(town.Homes!=null) {
town.Homes.ForEach(t=> t.CityId = entity.CityId);
}
}