0

我有 3 个模型,第一个模型具有相同的属性,但类名不同。我需要通过选择RelationshipTypeID 下拉列表选择,将值从基于父亲母亲的视图中插入数据库。所以我为母亲/父亲创造了共同的观点。在这里,我的意图是使用父模型插入母亲/父亲信息。

public class Mother
{
    public int MotherID { get; set; }
    public string FirstName { get; set; }
    public string SSN { get; set; }
    //---.etc.
}

public class Father
{
    public int  FatherID { get; set; }
    public string FirstName { get; set; }
    public string SSN { get; set; }
    //---.etc.
}
public class Parent
{
    public int RelationshipTypeID { get; set; }
    public int ParentID { get; set; }
    public string SSN { get; set; }
    //---.etc.
}

这是否可以在没有循环属性的情况下使用类似的类型转换?

if (parent.RelationshipTypeID == 1)
{
Mother m = (Mother)parent;
db.MotherRepository.Add(m);
db.SaveChanges();
}
if (parent.RelationshipTypeID == 1)
{
Mother m = (Mother)parent;
db.MotherRepository.Add(m);
db.SaveChanges();
}
4

3 回答 3

0

你可以这样做:

public class Parent
{
    public int ParentID { get; set; }
    public string SSN { get; set; }
    //---.etc.
}

public class Mother : Parent
{
}

public class Father : Parent
{
}

进而:

var List<Parent> parents = new List<Parent>();
parents.Add(new Mother());
parents.Add(new Mother());
parents.Add(new Father());
parents.Add(new Father());
parents.Add(new Father());

foreach(var parent in parents)
{
    if(parent is Mother)
    {
        SaveParentAsMother(parent);
    }

    if(parent is Father)
    {
        SaveParentAsFather(parent);
    }
}

或者通过使用特定代码在 Mother and Father 中实现 Save 函数来使用多态性:

public abstract class Parent
{
    public int ParentID { get; set; }
    public string SSN { get; set; }
    public abstract void Save();
    //---.etc.
}

public class Mother : Parent
{
    public override void Save()
    {
         // Save mother details
    }
}

public class Father : Parent
{
    public override void Save()
    {
         // Save father details
    }
}

foreach(var parent in parents)
{
    parent.Save();
}

额外的

从您的评论中,我了解到您正在寻找一种方法来实例化基于基类对象的派生对象。

class Mother : Parent
{
    public Mother(Parent parent)
    {
        this.SSN = parent.SSN;
        this.Name = parent.Name;
    }
}

这样,您可以从 Parent 对象创建一个 Mother 对象,如下所示:

var mother = new Mother(someParent);

请注意,我认为这非常丑陋,并强调根本不使用 Parent 的实例可能会更好。将 Parent 用作抽象而不是对象。

abstract class Parent
{
}

这将阻止您实例化 Parent,但仍允许您将 Mothers 和 Fathers 共享的行为和声明放在同一个基类中。

于 2013-11-11T14:57:50.167 回答
0

我最终这样做了!

  public ActionResult Create(ParentsViewModel parent)
    {
        Type ptype = parent.GetType(); 
        PropertyInfo[] ppropinfo = ptype.GetProperties();
        if (parent.RelationshipTypeID == 1)
        {
            Mother m = new Mother();
            Type mtype = m.GetType();
            PropertyInfo[] mpropinfo = mtype.GetProperties();
            foreach (PropertyInfo minfo in mpropinfo)
            {
                foreach (PropertyInfo pinfo in ppropinfo)
                {
                    if (minfo.Name == pinfo.Name)
                    {
                        minfo.SetValue(m,pinfo.GetValue(parent));
                    }
                }
            }
 var mres = m;
 db.MotherRepository.Add((mres));
 db.SaveChanges();
return View(mres);
        }

}
于 2013-11-12T08:32:01.023 回答
0

我为代码可重用性创建了一个函数:

 public object CompareNameAndSync(object source, object destination)
    {
        Type stype = source.GetType();
        Type dtype = destination.GetType();
        PropertyInfo[] spinfo = stype.GetProperties();
        PropertyInfo[] dpinfo = dtype.GetProperties();
        foreach (PropertyInfo des in dpinfo)
        {
            foreach (PropertyInfo sou in spinfo)
            {
                if (des.Name == sou.Name)
                {
                    des.SetValue(destination, sou.GetValue(source));
                }
            }
        }
        return destination;

    }

用法

     public ActionResult Create(ParentsViewModel parent)
    {
            Mother objmother = new Mother();
            objmother =(Mother)CompareNameAndSync(parent, objmother);

            db.MotherRepository.Add(objmother);
            db.SaveChanges();
            return View(objmother);
        }
于 2013-11-12T08:43:12.410 回答