将类类型作为参数c#传递并与字典一起使用

时间:2013-11-22 10:13:58

标签: c# class dictionary parameters

我创建了一个函数来返回一个字典,我希望将类名作为参数传递。但它给出了一个错误。我写的代码如下:

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();

人是我的班级名字。

2 个答案:

答案 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();