概括函数从单个类

时间:2017-06-26 13:50:24

标签: c# generics xamarin realm realm-list

我有一个有多个列表的类,例如CityStateCountry作为该类的成员,现在我想在其中创建一个泛化函数 用户可以传递国家或州或城市的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; }
}

1 个答案:

答案 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>;
}