[英]Repository returning objects implementing interfaces with generic types
我有一個問題要設法解決。 我可能會犯錯,但這是我要嘗試做的事情。
我有兩個界面。 第二接口具有應為第一接口的實現的屬性。 像這樣:
public interface ITypeA{
int Id {get;set;}
}
public interface IEntityA<T>: where T:ITypeA
{
string Name{get;set;}
T type{get;set;}
}
實現看起來像這樣:
public class TypeA: ITypeA{
int Id {get;set;}
}
public class EntityA: IEntityA<TypeA>{
public string Name{get;set;}
public TypeA type{get;set;
}
我可能已經做錯了事(?)。
現在,我正在實現存儲庫模式,其接口如下所示:
public interface IRepo{
IEnumerable<IEntityA<ITypeA>> GetObjects();
}
和實現:
public class DefaultRepo:Repo{
//Cunstructors
public IEnumerable<IEntitytA<ITypeA>> GetObjects(){
var objects = SomeMethodThatReturnsTheOjects();//Get objects as EntityA[];
return object.ToList();
}
}
這行不通。
我也嘗試過強制轉換,但是收到警告,提示它是可疑的轉換。
objects.Cast<IEntityA<ITypeA>[]>().ToList();
我在哪里做/認為錯誤?
幫助很多applicied :)
編輯:也許存儲庫接口聲明應如下所示
public interface IRepo<TEntityA> where TEntityA:IEntityA{
IEnumerable<TEntityA> GetObjects();
}
和實現:
public class DefaultRepo:Repo<EntityA>{
///Methods
}
想法? :)
倉庫基本上應該獲取json數據並將其轉換為實體。 但是,從不同的提供者那里可以看到json的不同,但是它包含相同的數據(或多或少)。 我使用Json.NET設置了解析,因此必須在存儲庫返回的實體實現中以不同的方式指定[JsonProperty]
你為什么不擁有:
public interface IUserRepository
{
IEnumerable<IUser> Find();
}
然后有UserFromSourceA
, UserFromSourceB
等。
這樣,您可以將JSON.NET屬性用於不同的實現,同時仍然公開相同的用戶界面。
我已經找到合適的解決方案。 我正在使用json.net,並且通過執行以下操作得以解決:
public interface ITypeA{
int Id {get;set;}
}
public interface ITypeB{
int id {get;set;}
}
public class TypeA:ITypeA
string Name{get;set;}
int id {get;set;}
[JsonConverter(typeof (ConcreteTypeConverter<TypeB>))]
ITypeB type{get;set;}
}
public class TypeB:ITypeB
{
int id {get;set;}
}
轉換器看起來像這樣:
public class ConcreteTypeConverter<TConcrete> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
//assume we can convert to anything for now
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
//explicitly specify the concrete type we want to create
return serializer.Deserialize<TConcrete>(reader);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//use the default serialization - it works fine
serializer.Serialize(writer, value);
}
}
如果沒有泛型,這些接口將變得更干凈,更易於閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.