我试图实现一个通用的存储库模式,该模式在IEnumerable中实现泛型项的CRUD操作。我一直在寻找可能已经在IEnumerable中的项目。我需要以编程方式传递哪些属性构成了“键”。或者使用不同的记录,然后使用LINQ对已定义的属性执行Enumerable.Any(),以便查看该对象是否已存在于IEnumberable中。到目前为止,这是我的代码。
import json
import numpy as np
json_input = '{"rings" : [[[-8081441.0, 5685214.0], [-8081446.0, 5685216.0], [-8081442.0, 5685219.0], [-8081440.0, 5685211.0], [-8081441.0, 5685214.0]]]}'
dict = json.loads(json_input)
numpy_2d_arrays = [np.array(ring) for ring in dict["rings"]]
注意:键可以是对象MyObject
上的任何属性答案 0 :(得分:1)
您可以使您的实体从公共接口继承:
public interface IEntity
{
int ID { get; set; }
}
然后你可以重新定义你的方法,如
public void AddItem<TEntity>(TEntity entity) where TEntity : IEntity
{
// Now you can access entity.ID
}
现在,如果您不想总是通过ID进行比较,那么您可以在方法中添加谓词:
public void AddItem<TEntity>(TEntity entity, Func<TEntity, bool> predicate)
{
var objects = GetAllItems().ToList();
// You might need some logic in the predicate to check for null
if(!objects.Any(a => predicate(a as TEntity))
{
objects.Add(entity);
_cache.AddReplaceCache(objects);
}
}
然后你将使用你的函数
repository.AddItem(entity, e => e.ID == entity.ID && e.OtherProperty == entity.OtherProperty);
答案 1 :(得分:0)
如果我理解正确您的问题TEntity
没有财产ID
。因此,让您的实体继承具有例如ID列的公共接口。
public interface IObject
{
int ID {get; set;}
//define all other properties which are shared between your Entities.
}
public class MyObject : IObject
{
public int ID {get; set;}
//other properties.
}
public void AddItem(TEntity item): where TEntity:IObject
{
var entities = GetAllItems().ToList(); //Method gets cached IEnumerable<TEntity>
if(!objects.Any(a=> a.ID == item.ID ))//Generically see if TEntity is already in the list based of defined properties
{
entities.Add(item);
}
}