使用泛型
你目前的方法会带来很多麻烦。因为你将要传递一个类的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()
使用类型
当然,这可以使用一个类型对象来完成,这需要使用反射来创建一个我们不知道类型的对象(该对象是字典)。操作如下:
public Dictionary<object, object> GetDetails(Type Class)
{
if (null == Class)
{
throw new ArgumentNullException("Class");
}
MvcDemoDBEntities db = new MvcDemoDBEntities();
Type DictType = typeof(Dictionary<,>).MakeGenericType(Class, typeof(object));
object dict = Activator.CreateInstance(typeof(DictType));
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.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)
{
var dbType = db.GetType();
var name = typeof(TClass).Name;
var prop = dbType.GetProperty(name);
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)
{
var dbType = db.GetType();
var name = Class.Name;
var prop = dbType.GetProperty(name);
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();