我有一个有多个列表的类,例如City
,State
和Country
作为该类的成员,现在我想在其中创建一个泛化函数
用户可以传递国家或州或城市的ID,它将删除该特定记录。我通过为每个类实现IEntity
接口来共享元素即id,以便我可以根据id
删除特定的城市,国家和州,以便我可以执行deleteDataFromNotification<City>("23323")
但这里的问题是IList
。有没有办法创建这样一个接受MatserInfo
并自动获取所需列表并删除实体的函数。
类似于getEntityList自动获取列表的地方
var data = realm.All<MasterInfo>().getEntityList().Where(d => d.id == id).FirstOrDefault();
以下是我的代码
void deleteData<T>(String id) where T : RealmObject, IEntity{
Realm realm = Realm.GetInstance();
try
{
var data = realm.All<T>().Where(d => d.id == id).FirstOrDefault();
realm.WriteAsync(tempRealm =>
{
if (data != null)
tempRealm.Remove(data);
});
}
catch (Exception e)
{
Debug.WriteLine("Exception " + e.Message);
}
}
public class MasterInfo : RealmObject {
[JsonProperty("listCityMaster", NullValueHandling = NullValueHandling.Ignore)]
public IList<City> cityList { get; }
[JsonProperty("listStateMaster", NullValueHandling = NullValueHandling.Ignore)]
public IList<State> stateList { get; }
[JsonProperty("listCountryMaster", NullValueHandling = NullValueHandling.Ignore)]
public IList<Country> countryList { get; }
}
public class Country : RealmObject,IEntity
{
[PrimaryKey]
public String id { get; set; }
public String name { get; set; }
}
public class State : RealmObject,IEntity
{
public String countryId { get; set; }
[PrimaryKey]
public String id { get; set; }
public String name { get; set; }
}
public class City : RealmObject,IEntity
{
public String countryId { get; set; }
[PrimaryKey]
public String id { get; set; }
public String name { get; set; }
public String stateId { get; set; }
}
public interface IEntity
{
String id { get; set; }
}
答案 0 :(得分:1)
对于显示的示例,您可以在MasterInfo类中实现GetEntityList<T>
,如下所示。如上所述,如果使用不匹配类型调用,则返回null,而不是错误。
public IList<T> GetEntityList<T>()
{
return (cityList as IList<T>) ?? (stateList as IList<T>) ?? (countryList as IList<T>);
}
编辑:显示更加动态的方式。
此版本创建一个实现IList的属性列表,并在静态字典变量中缓存属性getter。当您调用GetEntityList时,它使用适当的getter返回匹配列表。
当您的应用程序首次执行此代码时,将运行一次获取匹配属性的反射。只要调用GetEntityList,就会执行获取属性值的反射。
static Dictionary<Type, PropertyInfo> DictionaryOfILists = typeof(MasterInfo)
.GetProperties()
.Where(v => v.PropertyType.IsGenericType && v.PropertyType.GetGenericTypeDefinition() == typeof(IList<>))
.ToDictionary(v => v.PropertyType, v => v);
public IList<T> GetEntityList<T>()
{
return DictionaryOfILists[typeof(IList<T>)].GetValue(this) as IList<T>;
}