2016-05-24 15 views
0

Derzeit beim Übergeben eines Objekts, das Schnittstelle X zu einer Schnittstelle Y, die von Schnittstelle XI erbt erhält folgende Fehlermeldung:Fehler beim Übergeben eines Objekts, das Schnittstelle X zu einer Schnittstelle Y erbt, die von Schnittstelle X erbt. In C#

kann nicht implizit Typ 'InterfaceTestApp.Repositories.IUserModel' zu konvertieren 'InterfaceTestApp.Lib.IUserModel'. Eine explizite Konvertierung vorhanden ist (sind fehlt Ihnen eine Besetzung?)

Dies ist mein Test-Setup:

Repository

namespace InterfaceTestApp.Repositories 
{ 
    public class UserTestRepo 
    { 
     public IUserModel GetUser() => new UserModel() { Id = 1, Name = "Test" }; 
    } 
} 

namespace InterfaceTestApp.Repositories 
{ 
    public interface IUserModel 
    { 
     int Id { get; set; } 
     string Name { get; set; } 
    } 

    public class UserModel : IUserModel 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

Bibliothek

namespace InterfaceTestApp.Lib 
{ 
    interface IUserModelLib : Repositories.IUserModel { } 
} 

namespace InterfaceTestApp.Lib 
{ 
    class Authentication 
    { 
     public IUserModelLib AuthenticateUser() => new Repositories.UserTestRepo().GetUser(); 
    } 
} 

Grundsätzlich was ich Ich versuche hier zu vermeiden, dass Teile des Repo-Projekts einer Anwendung ausgesetzt werden, die das Lib-Projekt verwendet. Wie Sie sehen können, ist die IUserModelLib nur eine Pass-Through-Schnittstelle. Es erbt alles aus dem IUserModel im Repo-Projekt.

Es sollte einen Weg geben, dies zu tun, ohne eine Art manuelles Gießen zu tun. Jede Hilfe wäre willkommen. Vielen Dank!

+1

'IUserModelLib' kann alles tun, was' IUserModel' kann, aber nicht umgekehrt. Sie versuchen, 'IUserModel' von' IUserModelLib AuthenticateUser() 'Methode zurückzugeben, aber' IUserModel' hat keine Funktionalität, die 'IUserModelLib' in seiner eigenen Deklaration haben könnte, daher eine Fehlermeldung. – Sam

Antwort

1

Sie haben hier die Reihenfolge/Richtung der Vererbung verwirrt.

  • Lib.IUserModelLib implementiert Repositories.IUserModel
  • UserModel implementiert Repositories.IUserModel

Nur weil sie eine gemeinsame Schnittstelle teilen, bedeutet nicht, UserModel-Lib.IUserModelLib assignet werden kann.

  • Repositories.UserTestRepo().GetUser() gibt ein Repositories.IUserModel
  • Deshalb AuthenticateUser() ein Repositories.IUserModel anstelle einem Lib.IUserModelLib

Grundsätzlich zurückgeben muß, was ich versuche, hier zu tun ist, alle Teile des Repo-Projektes auszusetzen zu irgendeiner Anwendung, die das Lib-Projekt verwendet. Wie Sie sehen können, ist die IUserModelLib nur eine Pass-Through-Schnittstelle. Es erbt alles aus dem IUserModel im Repo-Projekt.

In diesem Fall können Sie die UserModel Klasse wickeln müssen, nicht die IUserModel Schnittstelle, stellen Sie die Klasse zu internal statt public und Ihre friend-assemblies definieren. Auf diese Weise können Sie UserModel in Ihrem Lib-Projekt verwenden, ohne es einem Projekt mit der Lib auszusetzen.

+0

Danke für die Bestätigung! Sehr geschätzt. ; 0) – Zorthgo

Verwandte Themen