使用泛型
您当前的方法会给您带来很多麻烦。当你要为你的类传递一个 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();