0

頭を包み込もうとしているという問題があります。私はひどく間違っているかもしれませんが、これが私がやろうとしていることです。

私は2つのインターフェースを持っています。2番目のインターフェースには、最初のインターフェースの実装である必要があるプロパティがあります。このようなもの:

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();

私はどこで間違っている/考えていますか?

多くのappriciatedを助けてください:)

編集: たぶん、リポジトリインターフェイス宣言は次のようになります

public interface IRepo<TEntityA> where TEntityA:IEntityA{
       IEnumerable<TEntityA> GetObjects();
    }

および実装:

public class DefaultRepo:Repo<EntityA>{
   ///Methods
}

考え?:)

4

2 に答える 2

0

私はこれに対する適切な解決策を見つけました。私は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);
        }
    }

ジェネリックがなくても、インターフェースはよりクリーンで読みやすくなります。

于 2012-12-02T09:32:13.610 に答える
0

リポジトリは基本的にjsonデータを取得し、それをエンティティに変換する必要があります。ただし、jsonは異なるプロバイダーとは非常に異なって見える可能性がありますが、同じデータが含まれています(多かれ少なかれ)。Json.NETを使用して解析を設定したため、リポジトリが返すエンティティの実装で[JsonProperty]を別の方法で指定する必要があります

なぜあなたはただ持っていませんか:

public interface IUserRepository 
{
   IEnumerable<IUser> Find();
}

そしてUserFromSourceAUserFromSourceBなどを持っています。

このようにして、同じユーザーインターフェイスを公開しながら、さまざまな実装でJSON.NET属性を使用できます。

于 2012-11-14T16:29:03.053 に答える