2016-07-20 40 views
2

我想在我的MVC C#實體框架應用程序上創建一個通用控制器。C#。什麼「類型T必須是引用類型才能用作參數。」手段?

public class GenericRecordController<T> : Controller 
{ 
    private DbSet<T> Table; 
    // ... 

    public action(){ 
     // ... 
     db.Entry(T_Instance).State = System.Data.Entity.EntityState.Modified; 
    } 
} 

然而DbSet < Ť>和T_Instance線具有一個編譯錯誤。

類型Ť必須以使用它作爲參數的引用類型。

當我約束它的一類

Controller where T : class 

它解決了。

上面的錯誤是什麼意思?

我不是要求解決方案。我想了解爲什麼會發生這個錯誤,爲什麼要爲一個類限制它解決它。

+0

不完整且不清楚。此外,一個有爭議的設計選擇。 –

+0

@HenkHolterman。爲什麼選擇糟糕的設計? –

+2

它使您的控制器面向模型,它們應該是面向視圖的。對CRUD不必要,對所有其他目的有害。 –

回答

8

編譯:

public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter 
where TEntity : class 

因爲它有一個type constraint通用類型必須是class那麼你必須初始化它與一個類型也ma tches this condition:

public class GenericRecordController<T> : Controller where T : class 
{ ... } 
6

他們顯然對泛型有一個約束。

所有你需要改變的是:

public class GenericRecordController<T> : Controller where T : class 

這說明,只有引用類型可以作爲一個類型。如果你看看Db<TEntity>定義提供了T.

相關問題