0

我有非常方法是一样的

我想用一种方法完成三个或更多方法下的工作

但我尝试使用泛型方法或反射,但无法编写好的方法或类我的方法:

第一种方法

    public ActionResult _Create1(MyClassView1  content)
    {            
        if (ModelState.IsValid)            
        {
            MyClass1 Home = new MyClass1();
            Mapper.Map(content, Home);
            if (content.Id <= 0)                
                db.MyClasse1s.Add(Home);                                    
            else               
                db.Entry(Home).State = EntityState.Modified;
            db.SaveChanges();
            return Content("Ok");
        }
        return PartialView(content);
    }

第二种方法

    public ActionResult _Create2(MyClassView2  content)
    {            
        if (ModelState.IsValid)            
        {
            MyClass2 Home = new MyClass2();
            Mapper.Map(content, Home);
            if (content.Id <= 0)                
                db.MyClasse1s.Add(Home);                                    
            else                
                db.Entry(Home).State = EntityState.Modified;
            db.SaveChanges();
            return Content("Ok");
        }
        return PartialView(content);
    }

第三种方法

    public ActionResult _Create3(MyClassView3  content)
    {            
        if (ModelState.IsValid)            
        {
            MyClass3 Home = new MyClass3();
            Mapper.Map(content, Home);
            if (content.Id <= 0)                
                db.MyClasse1s.Add(Home);                                    
            else                
                db.Entry(Home).State = EntityState.Modified;
            db.SaveChanges();
            return Content("Ok");
        }
        return PartialView(content);
    }

如何将这个类合并为一个类?

感谢您的回答

4

2 回答 2

2

我的头顶:

创建一个接口ISomething并让您MyClassViewX实现该接口。

public interface ISomething
{
    int Id{get;}
}

public class MyClassView1 : ISomething
{
    //...
}

使以下方法适应您的应用程序的类型,其中YourEntityContainerTypedb变量的类型,并且Collection<T>db: db.MyClasse1s, db.MyClasse2s...的属性的基本类型

public ActionResult_Create<T>(T content, Func<YourEntityContainerType, Collection<T>> collectionSelector, YourEntityContainerType db) where T:ISomething, new
{
    if(ModelState.IsValid)
    {
        T Home = new T();
        Mapper.Map(content, Home);
        if(content.Id <= 0)
            collectionSelector(db).Add(Home);
        else
            db.Entry(Home).State = EntityState.Modified;
        db.SaveChanges();
        return Content("Ok");
    }
    return PartialView(content);
}
于 2013-06-28T06:37:20.737 回答
0

有一种方法:AddOrUpdate<T>. 但问题是您必须找到一种方法来提供泛型参数T。假设您可以更改视图模型MyClassViewX,以便它们将自己映射到它们通过方法表示的实体GetEntity()。那么这就是你可以做的:

public ActionResult Create<T>(MyClassView content)
{            
    if (ModelState.IsValid)            
    {
        var entity = content.GetEntity();
        GetDbSet(db, entity).AddOrUpdate(entity);
        db.SaveChanges();
        return Content("Ok");
    }
    return PartialView(content);
}

DbSet<T> GetDbSet<T>(DbContext db, T entity) where T : class
{
    return db.Set<T>();
}

和方法GetEntity()

Class1 GetEntity()
{
    return Mapper.Map<Class1>(content);
}

这将重复代码减少到GetEntity它们所属的许多方法中:在知道它们映射的实体的类中。将GetDbSet实体作为参数来利用类型推断,从而获得泛型类型参数T

于 2013-06-29T07:57:44.307 回答