0

私は非常に方法が同じです

1 つのメソッドに 3 つ以上のメソッドを実行させたい

しかし、ジェネリックメソッドまたはリフレクションを使用しようとしましたが、適切なメソッドまたはクラスのメソッドを作成できません:

最初の方法

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

2番目の方法

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

このクラスを 1 つのクラスにマージするにはどうすればよいですか?

答えてくれてありがとう

4

2 に答える 2

2

私の頭のてっぺんの:

ISomethingインターフェイスを作成し、MyClassViewXそのインターフェイスを実装します。

public interface ISomething
{
    int Id{get;}
}

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

以下のメソッドをアプリケーションのタイプに合わせて調整します。ここYourEntityContainerTypeで、 はdb変数のタイプで、Collection<T>はプロパティの基本タイプdbです。db.MyClasse1sdb.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>。しかし問題は、ジェネリック パラメータを指定する方法を見つけなければならないことですTMyClassViewXメソッドによって表されるエンティティに自分自身をマップするように、ビュー モデルを変更できるとします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 に答える