2011-09-30 17 views
0

我有這個類:如何返回繼承通用列表的類?

public class CampaignMaps : List<CampaignMap> { }; 

的CampaignMap對象是我自己的,並沒有繼承任何東西。它有你的標準屬性和方法。

然後我有一個CampaignMapAdapter對象,它充當我的ObjectDatasource的數據。它有一個數據一個私有財產:

[DataObject(true)] 
public class CampaignMapAdapter 
{ 
    private Database db = new Database(
    ConfigurationManager.AppSettings["AppName"], 
    ConfigurationManager.AppSettings["DBService"], 
    ConfigurationManager.AppSettings["DBUser"]); 

    private CampaignMaps _data 
    { 
    get 
    { 
     CampaignMaps maps = new CampaignMaps(); 
     CampaignsAdapter adapter = new CampaignsAdapter(); 
     db.Init(); 
     db.AddParameter(null, null, ParameterDirection.ReturnValue, OracleType.Cursor); 
     DataSet ds = db.ExecuteDataSet(PROC_GET_CAMPAIGN_MAPS); 
     DataTable dt = ds.Tables[0]; 
     foreach (DataRow row in dt.Rows) 
     { 
     CampaignMap campaignMap = new CampaignMap(); 
     //populate the campaignMap object... 
     maps.Add(campaignMap); 
     } 
     return maps; 
    } 
    set 
    { 
     _data = value; 
    } 
    } 

    [DataObjectMethod(DataObjectMethodType.Select, true)] 
    public CampaignMaps GetFiltered(bool hasErrors) 
    { 
    var selectQuery = from c in _data where c.HasError == hasErrors select c; 
    _data = selectQuery; 
    } 
} 

_data = selectQuery;拋出錯誤:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'CampaignMaps'. An explicit conversion exists (are you missing a cast?)

我用簡單的英語假設我要_data總是包含ALL我的數據元素,然後調用特別是select應該根據需要減少它們。我如何去做這件事?

在此先感謝。

+1

你在'CampaignMaps'中做了一些特定的事情嗎?使用它而不是僅僅列出'List '將會使這變得更加困難。 –

+1

你爲什麼需要這樣的班級?你爲什麼不能返回一個'List '對象,或者用'List '字段創建一個類。 –

回答

2

你爲什麼要做_data = selectQuery;

我想你在GetFiltered方法意圖會是這樣的:爲什麼您使用的是CampaignMaps

return new CampaignMaps(selectQuery); 

然而,像亞當說,我會認真考慮。

如果你想的公共接口只允許通過過濾「HasErrors」,使GetFiltered方法是這樣的:

public IEnumerable<CampaignMap> GetFiltered(bool hasErrors) 
{ 
    return _data.Where(c => c.HasError == hasErrors); 
} 

我看不出有任何理由,你爲什麼會想有這個GetFiltered方法。爲什麼不將_data屬性作爲只讀IEnumerable<CampaignMap>公開,然後允許其他對象直接對其運行Linq查詢?就像這樣:

public IEnumerable<CampaignMap> Data 
{ 
    get { return _data; } 
} 

然後在其他地方我可以只寫Data.Where(c => c.HasError == whatever)

+0

我想我的結構有點複雜。我接受了你和大家的建議,並且一起取消了所有CampaignMaps類,並將所有內容列表清單或IEnumerable ,並且它可以全面工作。 –

3

嗯,你可以這樣做:

CampaignMaps maps = new CampaignMaps(); 
maps.AddRange(selectQuery); 
_data = maps; 

這將讓你在正確的類型正確的數據。

但是,我會強烈考慮而不是List<T>開始 - 它幾乎從來不是一個好主意;除非你真的專注於這種行爲,否則更喜歡構成而不是繼承。

我也會說,在GetFiltered方法中突變當前對象違反了最少突擊的原則。我會要麼改變它,使它更清楚,它是一個突變(例如「FilterByErrors」),並給它一個無效返回類型,只是讓它返回過濾列表而不會突變當前對象。