2010-09-09 2 views
2

согласно ниже определениямКак бросить общий класс для общего интерфейса в 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>? 
    } 
    ... 
} 

Update:

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

так с использованием выше подхода, я не класс Таблицы связан методов и способностей. это хорошее решение или нет? и почему?

ответ

4

В C# 3.0 и odler это нелегко - см. Также covariance and contravariance в C# 4.0.

Проблема в том, что Table<Url> реализует интерфейс ITable<Url> - эта часть отливки проста. Сложный бит отличает ITable<Url> в ITable<IUrl>, потому что эти два типа на самом деле никак не связаны ...

В C# до 4.0 нет простого способа сделать это - вам явно нужно создать новая реализация ITable<..> для правильного типа (например, путем делегирования). В C# 4.0 это преобразование может быть выполнено до тех пор, пока ITable является covariant interface.

+0

спасибо, я также нашел другой подход, который очень легко (но я знаю, что это неправильное решение), поэтому я обновил свой вопрос. вы можете проверить это и сказать мне ваше предложение – Sadegh