通用类及其子类

时间:2016-04-28 15:57:29

标签: c# generic-programming

我有基类Entity和enheritance类说Home,

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);
        }
    }
}

这项工作只针对父母如何访问孩子,我想简单地说,因为我有一个数据插入数据库,因为我有一个数据插入数据库

2 个答案:

答案 0 :(得分:2)

看起来有两个无关的问题

  • 如果属性存在,如何在不知情的情况下设置对象的属性:反射就像你解决它一样。请注意,这不是C#方式 - 您使用某些接口并将泛型限制为该接口,以允许对属性进行强类型访问。

  • 如何在不知道类型的情况下枚举“子”对象:传统的解决方案是为“GetChildren”功能添加接口。或者,您可以使用反射并查找“子”类型的所有属性,并与类型为IEnumerable<"child type">的所有属性组合。

    如果你可以使用某些约定dynamic可以更容易替代反射(即每种类型都公开Children属性来枚举它们:

    dynamic town = GetTown();
    foreach(dynamic child in town.Children) {...}
    

答案 1 :(得分:1)

您可以直接设置属性,无需反射。

entity.CityId = 1;
if(entity is Town) {
    var town = entity as Town;
    if(town.Homes!=null) {
        town.Homes.ForEach(t=> t.CityId = entity.CityId);
    }
}