Jest to więc rodzaj tępego pytania, ale pozwól mi sprawdzić, czy mogę to wyjaśnić stosunkowo prosto. Powiedzmy, że mam następujący interfejs:Wdrażanie ICollection <ISomething> z konkretnym typem w celu zaspokojenia Entity Framework
public interface IFoo
{
ICollection<IBar> Bars { get; set; }
}
Które I następnie wdrożyć z:
public class Foo : IFoo
{
public virtual ICollection<IBar> Bars { get; set; }
}
Tylko Entity Framework nie może pracować z interfejsów, więc prawie całkowicie ignoruje tę właściwość nawigacji. W celu uzyskania EF go rozpoznać, muszę go zmienić na:
public virtual ICollection<Bar> Bars { get; set; }
Gdzie Bar
byłaby moja realizacji IBar
. Tylko, że nie implementuje interfejsu, który chce IBar
nie Bar
.
Rozważmy teraz nieco inny scenariusz, gdzie Mam tylko podstawowy klucz obcy:
public interface IFoo
{
IBar Bar { get; set; }
}
public class Foo : IFoo
{
public virtual IBar Bar { get; set; }
}
sam problem, ale tutaj mogę go rozwiązać dodając:
public class Foo : IFoo
{
public virtual Bar Bar { get; set; }
IBar IFoo.Bar
{
get { return Bar; }
set { Bar = (Bar)value; }
}
}
EF jest szczęśliwy, ponieważ ma konkretny typ i interfejs jest szczęśliwy, ponieważ ma implementację z IBar
. Problem polega na tym, że nie mogę wymyślić, jak zastosować tę samą logikę z ICollection<IBar>
, ponieważ (ICollection<Bar>)value
podnosi wyjątek mówiąc "Nie można niejawnie przekonwertować typu ICollection<Bar>
na ICollection<IBar>
".
Jak właściwie wykonać rzutowanie?
UPDATE
Więc nie zwracając szczególną uwagę na wystarczającą gdzie błąd był wygenerowany. To naprawdę narzekało na bit get { return Bars; }
. Udało mi się pozbyć tego błędu, zmieniając go do:
public class Foo : IFoo
{
public virtual ICollection<Bar> Bars { get; set; }
ICollection<IBar> IFoo.Bars
{
get { return (ICollection<IBar>)Enumeration.Cast<IBar>(Bars); }
set { Bars = (ICollection<Bar>)value; }
}
}
To wydaje się nieco hokey do mnie jednak, jakbym tylko maskowanie błąd i tworząc małą bombę zegarową dla siebie. Byłbym wdzięczny za wszelkie przemyślenia lub alternatywne rozwiązania.
jestem ciekaw: Jaka jest twoja sytuacja, w której trzeba by to zrobić ? – IronMan84
Mam obiekt, który implementuje interfejs, który odwołuje się tylko do innych interfejsów, a nie konkretnych typów. –
Czy twój getter i seter rzeczywiście działają?Spodziewam się, że zgłoszony zostanie wyjątek InvalidCastException dla przynajmniej niektórych poprawnych instancji kolekcji. – hvd