通用反射,如何获取列表?

时间:2014-06-06 13:50:25

标签: c# generics reflection

我有以下代码:

var prop = FindEntityProperty(entityName);

if(prop==null)
{
    throw new InvalidOperationException("entityName: " + entityName);
}

var db = new DatabaseContext();
Type returnType = prop.PropertyType;

var col = (prop.GetValue(db) as ???);
Data = col.ToList(); //or something IEnumerable<?>

情况看起来,我PropertyInfo在这里命名为prop。 我确定这个属性是DbSet<Τ>。我不知道T是什么类型(只是它是一个类)。但因为它是通用的DbSet,它可以被视为通用的IEnumarble。 因此,因为propertyInfo.GetValue()返回一个简单的对象,Ι需要转换我的集合。

我该怎么做?

我知道这在编程中是一种不好的做法。在这里,我只是为了学习反思。

1 个答案:

答案 0 :(得分:2)

我有类似的问题,我想创建一个方法,从数据库中返回对象,因此创建了这段代码。 我希望这会对你有所帮助:

将它放入DatabaseContainer:

public IEnumerable<TEntity> Find<TEntity>(Dictionary<string, object> findValues = null) where TEntity : EntityObject
    {
        var entities = this.CreateObjectSet<TEntity>().ToList();

        if (findValues!= null && findValues.Count > 0)
        {
            foreach (var item in findValues)
            {
                if(item.Value != null)
                    entities = entities.DynamicContains<TEntity>(item.Key, item.Value);
            }
        }

        return entities;
    }

把它放到一个扩展课程中:

public static List<TEntity> DynamicContains<TEntity>(this IEnumerable<TEntity> entities, string propertyName, object item)
    {
        List<TEntity> comparingEntities = new List<TEntity>();
        foreach (var obj in entities)
        {
            var property = obj.GetType().GetProperty(propertyName);
            if (property.PropertyType == typeof(String) && ((string)property.GetValue(obj, new object[] { })).ToLower().Contains(item.ToString().ToLower()))
                comparingEntities.Add(obj);

            if (property.PropertyType == typeof(Boolean) && ((bool)property.GetValue(obj, new object[] { })) == (bool)item)
                comparingEntities.Add(obj);     
        }

        return comparingEntities;
    }

用法:

Dictionary<string, object> findValues = new Dictionary<string, object>();
findValues.Add("Name", "Tom");
findValues.Add("Age", 4);

var list1 = db.Find<Person>(findValues); // Returns a list of persons that includes the find values.
var list2 = db.Find<Person>() // Returns all persons in the database.