2013-03-11 63 views
2

是的,我想創建一個List<T>,我的T是用戶定義的數據類型,即POCO類,例如用戶資料。
爲什麼:我正在使用MvcJqGrid,我想編寫一個用於創建Json數據的通用代碼,所以在運行時我會知道從哪個類(表)中需要獲取數據。我們可以在運行時創建List <用戶定義的數據類型>嗎?

我的代碼

public ActionResult TestGrid() 
{ 
    string spname = Request.Params["storedprocedurename"]; //spname = UserProfile 
    // i get this from the post data of MvcJqGrid i.e. user when create a jqgrid, in 
    // a view defines the table/spname from where data gets loaded in grid. 
    MyEntities _context = new MYEntities();    
    List<UserProfile> userProfiles = _context.UserProfiles.ToList<UserProfile>(); 
    // here some code to create a json data and return 
} 

所以這個用戶配置我這裏硬編碼的,如果我在Request.params 得到RoleMaster(例如),所以我怎樣才能做到這一點。

配置細節
的EntityFramework版本= 5.0.0.0數據庫第一種方法
MVC 4
MvcJqGrid 1.0.9
的.NET Framework 4.5

+0

你可能會得到一個相關的問題一些更多的信息,其中泛型函數在運行時參數化:http://stackoverflow.com/questions/13 397286/appending-string-to-t-to-produce-a-new-class-name/13397489#13397489 – 2013-03-11 11:55:36

回答

1

如果spName是一個字符串,你可以得到的類型由:

Type genericType = Type.GetType(string.Format("YourNamespace.{0}", spName)); 

然後userProfiles下面將類型的使用代碼:

var method = _context.GetType().GetMember("Set") 
       .Cast<MethodInfo>() 
       .Where(x => x.IsGenericMethodDefinition) 
       .FirstOrDefault(); 

var genericMethod = method.MakeGenericMethod(genericType); 
dynamic invokeSet = genericMethod.Invoke(_context, null); 

// this list will contain your List<UserProfile> 
var userProfiles = Enumerable.ToList(invokeSet); 

欲瞭解更多信息:

  1. Reflection, Linq and DbSet
+0

更新了答案。現在你會得到所需的類型 - 列表 Oliver 2013-03-11 14:04:48

+0

謝謝,這解決了我的問題 – 2013-03-12 05:27:15

0

這將做到這一點:

public ActionResult Index() 
{ 
    string spname = Request.Params["storedprocedurename"]; 
    Type t = typeof(MYEntities) 
     .Assembly 
     .GetType(string.Format("<namespace>.{0}", spname); 
    dynamic instance = Activator.CreateInstance(t); 
    return View(ListData(instance)); 
} 

private List<T> ListData<T>(T instance) 
    where T : class 
{ 
    MYEntities context = new MYEntities(); 
    return context.Set<T>().ToList(); 
} 
相關問題