2010-09-09 5 views
2

selon les définitions ci-dessousComment jeter une classe générique à une interface générique en C#

interface myin 
{ 
    int id { get; set; } 
} 
class myclass:myin 
{ 
    public int id { get; set; } 
} 
[Database] 
public sealed class SqlDataContext : DataContext, IDataContext 
{ 
    public SqlDataContext(string connectionString) : base(connectionString){} 
    public ITable<IUrl> Urls 
    { 
     get { return base.GetTable<Url>(); } //how to cast Table<Url> to ITable<IUrl>? 
    } 
    ... 
} 

Mise à jour:

public IEnumerable<IUrl> Urls 
{ 
    get { return base.GetTable<Url>(); } 
} 

par l'usage, au-dessus de l'approche, je ne classe table associée méthodes et capacités. c'est une bonne solution ou pas? et pourquoi?

Répondre

4

En C# 3.0 et odler, ce n'est pas toujours possible - voir aussi covariance and contravariance en C# 4.0.

Le problème est que Table<Url> implémente l'interface ITable<Url> - cette partie de la distribution est facile. Le bit délicate est ITable<Url> à ITable<IUrl>, parce que ces deux types ne sont en fait pas liés en aucune façon ...

En C# avant 4.0, il n'y a pas de moyen facile de le faire - vous aurez explicitement besoin de créer un nouvelle implémentation de ITable<..> pour le type générique correct (par exemple par délégation). En C# 4.0, cette conversion peut être effectuée tant que ITable est covariant interface.

+0

merci, j'ai également trouvé une autre approche qui est très facilement (mais je sais que ce n'est pas une solution correcte) donc je suis maintenant mis à jour ma question. pouvez-vous vérifier et me dire votre suggestion – Sadegh

Questions connexes