我创建一个函数来返回一个字典,我想通过作为参数传递类名.但它给出了一个错误.我写的代码如下
public Dictionary<object,object> GetDetails(Type Classname) { MvcDemoDBEntities db = new MvcDemoDBEntities(); Dictionary<Classname,object> dict = new Dictionary<Classname,object>(); var data = (from h in db.People select h).ToList(); foreach (var item in data) { dict.Add(data,true); } return dict; }
List<people> list = GetDetails(people).Keys.ToList();
人是我的班级名字.
解决方法@H_502_13@
使用泛型
你目前的做法会给你带来很多麻烦.当您要为类传递Type对象时,您需要反射才能创建Dictionary.
作为替代方案,我建议您创建一个通用方法:
public Dictionary<object,object> GetDetails<TClass>()
{
MvcDemoDBEntities db = new MvcDemoDBEntities();
Dictionary<TClass,object> dict = new Dictionary<TClass,object>();
var data = (from h in db.People
select h).ToList();
foreach (var item in data)
{
dict.Add(data,true);
}
return dict;
}
像这样用它:
List<people> list = GetDetails<people>().Keys.ToList();
使用Type
当然,这可以使用Type对象来完成,这需要使用反射来创建一个我们不知道的类型的对象(该对象是字典).这样做如下:
public Dictionary<object,object> GetDetails(Type Class)
{
//Null check
if (null == Class)
{
throw new ArgumentNullException("Class");
}
MvcDemoDBEntities db = new MvcDemoDBEntities();
//Get the generic dictionary type:
Type DictType = typeof(Dictionary<,>).MakeGenericType(Class,typeof(object));
//Create the dictionary object:
object dict = Activator.CreateInstance(typeof(DictType));
//Get the Add method:
var add = DictType.GetMethod("Add",new Type[]{Class,typeof(object)});
var data = (from h in db.People
select h).ToList();
foreach (var item in data)
{
//add to the dictionary:
add.Invoke(dict,new object[]{item,true});
}
return dict;
}
使用这样:
List<people> list = GetDetails(typeof(people)).Keys.ToList();
深层发掘
我注意到你有这条线:
var data = (from h in db.People select h).ToList();
您可能有兴趣将People更改为与您传入的类的名称相匹配的属性.这只能通过反射存档.以与我们如何获得字典的Add方法类似的方式,我们可以从对象db获取属性,该属性由参数类型给出.
使用泛型
public IEnumerable<TClass> GetCollection<TClass>(MvcDemoDBEntities db)
{
//get the type of db
var dbType = db.GetType();
//get the name of the type TClass
var name = typeof(TClass).Name;
//get the property
var prop = dbType.GetProperty(name);
//read the property and return
return prop.GetValue(db);
}
要使用,请将其替换为:
var data = (from h in db.People select h).ToList();
有了这个:
var data = (from h in GetCollection<TClass>(db) select h).ToList();
使用Type
这里的斗争是我们不知道项目类型…所以我将使用IEnumerable.
public IEnumerable GetCollection(MvcDemoDBEntities db,Type Class)
{
//get the type of db
var dbType = db.GetType();
//get the name of the type Class
var name = Class.Name;
//get the property
var prop = dbType.GetProperty(name);
//read the property and return
return prop.GetValue(db);
}
要使用,请将其替换为:
var data = (from h in db.People select h).ToList();
有了这个:
var data = (from h in GetCollection(db,Class).Cast<object>() select h).ToList();
你目前的做法会给你带来很多麻烦.当您要为类传递Type对象时,您需要反射才能创建Dictionary.
作为替代方案,我建议您创建一个通用方法:
public Dictionary<object,object> GetDetails<TClass>() { MvcDemoDBEntities db = new MvcDemoDBEntities(); Dictionary<TClass,object> dict = new Dictionary<TClass,object>(); var data = (from h in db.People select h).ToList(); foreach (var item in data) { dict.Add(data,true); } return dict; }
像这样用它:
List<people> list = GetDetails<people>().Keys.ToList();
使用Type
当然,这可以使用Type对象来完成,这需要使用反射来创建一个我们不知道的类型的对象(该对象是字典).这样做如下:
public Dictionary<object,object> GetDetails(Type Class) { //Null check if (null == Class) { throw new ArgumentNullException("Class"); } MvcDemoDBEntities db = new MvcDemoDBEntities(); //Get the generic dictionary type: Type DictType = typeof(Dictionary<,>).MakeGenericType(Class,typeof(object)); //Create the dictionary object: object dict = Activator.CreateInstance(typeof(DictType)); //Get the Add method: var add = DictType.GetMethod("Add",new Type[]{Class,typeof(object)}); var data = (from h in db.People select h).ToList(); foreach (var item in data) { //add to the dictionary: add.Invoke(dict,new object[]{item,true}); } return dict; }
使用这样:
List<people> list = GetDetails(typeof(people)).Keys.ToList();
深层发掘
我注意到你有这条线:
var data = (from h in db.People select h).ToList();
您可能有兴趣将People更改为与您传入的类的名称相匹配的属性.这只能通过反射存档.以与我们如何获得字典的Add方法类似的方式,我们可以从对象db获取属性,该属性由参数类型给出.
使用泛型
public IEnumerable<TClass> GetCollection<TClass>(MvcDemoDBEntities db) { //get the type of db var dbType = db.GetType(); //get the name of the type TClass var name = typeof(TClass).Name; //get the property var prop = dbType.GetProperty(name); //read the property and return return prop.GetValue(db); }
要使用,请将其替换为:
var data = (from h in db.People select h).ToList();
有了这个:
var data = (from h in GetCollection<TClass>(db) select h).ToList();
使用Type
这里的斗争是我们不知道项目类型…所以我将使用IEnumerable.
public IEnumerable GetCollection(MvcDemoDBEntities db,Type Class) { //get the type of db var dbType = db.GetType(); //get the name of the type Class var name = Class.Name; //get the property var prop = dbType.GetProperty(name); //read the property and return return prop.GetValue(db); }
要使用,请将其替换为:
var data = (from h in db.People select h).ToList();
有了这个:
var data = (from h in GetCollection(db,Class).Cast<object>() select h).ToList();