2014-11-15 72 views
0

我是接口新手。需要一個接口的c#方法?

我有很多對象作爲DTO通過我的圖層傳遞給UI。其中一些非常複雜(很多屬性),但我只想在某些情況下在DropDown列表中使用它們。這些DTO全部具有int Idstring Description

我想創建一個靜態函數,它接受這些對象之一的List<>,並返回一個List<SelectListItem>

所以,我嘗試使用接口的第一次。

我創建了一個接口:

public interface IListableItem 
{ 
    int Id { get; set; } 
    string Description { get; set; } 
} 

然後,我分配了接口,我的DTO對象之一,我想轉換:

public class CategoryDto : BaseDto , IListableItem 
{ 
    public int PortfolioId { get; set; } 
    public string Description { get; set; } 
    public List<ExtendedSubCategoryDto> SubCategories { get; set; } 
    public bool IsExpenseCategory { get; set; } 

    public CategoryDto() 
    { 
     SubCategories = new List<ExtendedSubCategoryDto>(); 
    } 
} 

然後,我創建了通用的方法需要列出類別dtos,並希望返回列表

public static List<SelectListItem> TranslateToSelectList(List<IListableItem> source) 
{ 
    var reply = source.Select(item => new SelectListItem 
    { 
     Value = item.Id.ToString(CultureInfo.InvariantCulture), Text = item.Description 
    }).ToList(); 

    return reply; 
} 

但是,當我嘗試使用這個方法,將它傳遞給List,它失敗了。

model.Categories = 
     Translator.TranslateToSelectList(MyService.GetCategoriesByPortfolioId()); 

GetCategoriesByPortfolioId返回一個列表。

它的失敗與錯誤:

CategoryDto is not assignable to IListableItem

這也可能是我的一個基本的瞭解的接口問題,但我在做什麼錯了,我怎麼能解決這個問題?

+0

'MyService.GetCategoriesByPortfolioId()'返回的類型是什麼? – Dirk

回答

5

如果您的方法預計爲List<IListableItem>,則無法通過List<CategoryDTO>

如果有可能,你可以Add實現該接口IListableItem成持有CategoryDTO元素的集合,而讀他們的元素不同實例。

最終,這是沒有意義的。

如果您使用IEnumerable接口,您可以修復它。這允許covariance(going from higher type to lower type in generic type parameter)

它的工作原理的原因,是IEnumerable是集合的「只讀視圖」,所以你不能真正添加​​任何東西給它 - 以及什麼是最重要的type parameter標記

public static List<SelectListItem> TranslateToSelectList(
IEnumerable<IListableItem> source) 
{..} 
+3

*它應該是理論上有效的*:它只對只讀集合有效,但不是一般。這就是爲什麼可以用IEnumerable來完成的原因。 – Dirk

+0

謝謝克里斯!這解決了它。我不知道爲什麼。需要閱讀,但謝謝。 – Craig

+1

@克雷格一個'清單'不能投入'清單',因爲你可以添加一個'香蕉'到'清單'。 – Dirk

相關問題