我有以下代码:
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()
返回一个简单的对象,Ι需要转换我的集合。
我该怎么做?
我知道这在编程中是一种不好的做法。在这里,我只是为了学习反思。
答案 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.