[英]How do I create a generic class that takes as its generic type a generic class?
[英]How do I tell a generic class instance about its generic owning collection?
我有一個抽象類“RiskBaseCollection”,它使用泛型本質上是字典的容器。 存儲在此字典中的項目類型必須在構造函數中傳遞,並且它們必須從名為“RiskBase”的基類繼承:
我在字典容器類中有一個方法,它調用數據庫查詢來填充字典的內容(數據庫調用取決於另一個字段中設置的內容,但這對我來說並不重要)。
在填充字典時,對於每個數據庫記錄,我想查看是否已經創建並存儲了類的適當實例:如果已經創建和存儲,我將檢索它並向其添加其他值。 如果沒有,我會創建一個 RiskBase 類的新實例。 我已經用泛型做到了這一點,這樣實際上創建了正確類型的 RiskBase。
我正在努力解決的是,我想告訴“RiskBase”類的每個實例“擁有”它的集合。 我嘗試了各種方法,但無法讓它發揮作用。
這是 Collection 類和整個 RiskBase 類的摘錄:
public abstract class RiskBaseCollection<T> where T : RiskBase, new()
{
public Dictionary<int, T> Items = new Dictionary<int, T>();
#region Non-critical stuff
//Removed - not important to my issue.
#endregion
public void ReadData()
{
if (ValidConnectionInfo == false)
{
return;
}
//Create the connection:
using (OleDbConnection conn = new OleDbConnection(ReaderConnectionString))
{
if (conn != null) conn.Open();
if (conn.State == System.Data.ConnectionState.Open)
{
using (OleDbCommand command = new OleDbCommand(SQL, conn))
{
if (command != null)
{
using (OleDbDataReader reader = command.ExecuteReader())
{
if (reader != null && reader.HasRows)
{
while (reader.Read())
{
int RiskID = reader.GetValue<int>("ID");
string Title = reader.GetValue<string>("TITLE");
string Status = reader.GetValue<string>("STATUS");
DateTime RaisedDate = reader.GetValue<DateTime>("RAISED_DATE");
DateTime ExpiryDate = reader.GetValue<DateTime>("EXPIRY_DATE");
//Get the FLOC string for the current record
string FunctionalLocation = reader.GetValue<string>("FUNCTIONAL_LOCATION");
T thisRisk = (Items.ContainsKey(RiskID)) ? (T)Items[RiskID] : new T();
thisRisk.RiskID = RiskID;
thisRisk.Title = Title;
thisRisk.Status = Status;
thisRisk.RaisedDate = RaisedDate;
thisRisk.ExpiryDate = ExpiryDate;
thisRisk.AddFunctionalLocation(FunctionalLocation);
thisRisk.Owner = this; //<=Error: Cannot implicitly convert type 'CRT.Risks.RiskBaseCollection<T>' to 'CRT.Risks.RiskBaseCollection<CRT.Risks.RiskBase>'
Items[RiskID] = thisRisk;
}
}
}
}
}
}
}
}
}
public class RiskBase
{
public RiskBaseCollection<RiskBase> Owner { get; set; }
public virtual RiskType RiskType { get; set; }
public RiskBase() { }
public RiskBase(RiskBaseCollection<RiskBase> riskBaseCollection, RiskType riskType)
{
Owner = riskBaseCollection;
RiskType = riskType;
}
public virtual int RiskID { get; set; }
public virtual string Title { get; set; }
public virtual string Status { get; set; }
public virtual DateTime RaisedDate { get; set; }
public virtual DateTime ExpiryDate { get; set; }
public virtual List<string> FunctionalLocations { get; set; } = new List<string>();
public virtual void AddFunctionalLocation(string functionalLocation)
{
if (!FunctionalLocations.Contains(functionalLocation)) FunctionalLocations.Add(functionalLocation);
}
}
本質上,我正在尋找一種為 RiskBase 類設置“所有者”屬性的方法。
使RiskBaseCollection<T>
實現協變通用接口,並將RiskBase.Owner
屬性的類型更改為此接口:
// new interface
interface IRiskBaseCollection<out T>
{
// interface members
}
public abstract class RiskBaseCollection<T> : IRiskBaseCollection<T>
where T : RiskBase, new()
{
// ...
thisRisk.Owner = this; // this now compiles!
}
public class RiskBase
{
public IRiskBaseCollection<RiskBase> Owner { get; set; } // interface reference
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.