2013-03-11 3 views
2

Да, я хочу создать List<T>, а мой T - это определенный пользователем тип данных, то есть класс POCO, например. Профиль пользователя.
Почему: Я использую MvcJqGrid, и я хочу написать общий код для создания данных Json, поэтому во время выполнения я узнаю, из какого класса (таблицы) мне нужно получить данные.Можем ли мы создать List <user defined datatype> во время выполнения?

Мой код

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 
} 

так это UserProfile я жёстко здесь, что, если я получаю RoleMaster (например.) В Request.Params так, как я могу добиться этого.

детали конфигурации
entityFramework Version = 5.0.0.0 базы данных первого подхода
MVC MvcJqGrid 1.0.9
.NET Framework 4.5

+0

Вы можете получить некоторую информацию от соответствующего вопроса , в котором универсальная функция была параметризована во время выполнения: http://stackoverflow.com/questions/13 397286/appending-string-to-t-to-production-a-new-class-name/13397489 # 13397489 –

ответ

1

Если ИмяХранимойПроцедуры является строкой, вы можете получить тип по:

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

Тогда userProfiles ниже будет типа List<UserProfile> с использованием кодов:

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

+0

Спасибо, Это решило мою проблему –

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(); 
} 
Смежные вопросы