我创建了一个函数来返回一个字典,我希望将类名作为参数传递。但它给出了一个错误。我写的代码如下:
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();
人是我的班级名字。
答案 0 :(得分:8)
您目前的做法会给您带来很多麻烦。当您要为类传递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对象来完成,这需要使用反射来创建一个我们不知道的类型的对象(该对象是字典)。这样做如下:
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();
这里的斗争是我们不知道项目类型......所以我将使用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();
答案 1 :(得分:2)
您需要使用typeof
来传递班级类型
List<people> list = GetDetails(typeof(people)).Keys.ToList();