Nay*_*ori 7 c# parameters dictionary class
我创建一个函数来返回一个字典,我想通过作为参数传递类名.但它给出了一个错误.我写的代码如下
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;
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么,我想动态地用类名调用这个函数,如下所示:
List<people> list = GetDetails(people).Keys.ToList();
Run Code Online (Sandbox Code Playgroud)
人是我的班级名字.
你目前的做法会给你带来很多麻烦.当您要为类传递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;
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
List<people> list = GetDetails<people>().Keys.ToList();
Run Code Online (Sandbox Code Playgroud)
当然,这可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
使用这样:
List<people> list = GetDetails(typeof(people)).Keys.ToList();
Run Code Online (Sandbox Code Playgroud)
我注意到你有这条线:
var data = (from h in db.People select h).ToList();
Run Code Online (Sandbox Code Playgroud)
您可能有兴趣更改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);
}
Run Code Online (Sandbox Code Playgroud)
要使用,请替换为:
var data = (from h in db.People select h).ToList();
Run Code Online (Sandbox Code Playgroud)
有了这个:
var data = (from h in GetCollection<TClass>(db) select h).ToList();
Run Code Online (Sandbox Code Playgroud)
这里的斗争是我们不知道项目类型...所以我将使用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);
}
Run Code Online (Sandbox Code Playgroud)
要使用,请替换为:
var data = (from h in db.People select h).ToList();
Run Code Online (Sandbox Code Playgroud)
有了这个:
var data = (from h in GetCollection(db, Class).Cast<object>() select h).ToList();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18553 次 |
最近记录: |