[英]How to return a different object depending on IF in C# (Generics)
我有一個ASP.NET MVC(非核心)項目,遇到了一些問題,我認為終於可以開始學習如何正確使用泛型,這可以解決我的問題。
我的情況是我有一個SQL連接,該連接返回數據,並且根據SQL中一個字段的結果,我想使用兩種不同的模型。 這些模型具有許多共同的屬性,因此我認為最佳實踐是創建一種方法,該方法選擇要創建的模型,填充差異,返回模型,然后繼續填充“公共”屬性。
我嘗試閱讀有關泛型的內容,但是我對此很陌生,因此我沒有取得太大進展。
我的代碼示例如下所示:
public ResultVM MainClass()
{
var resultData = new ResultVM();
// ... SQL returns data
while (reader.Read())
{
resultData.Add(reader);
}
return resultData;
}
public object CreateObject(SqlDataReader indata)
{
if((indata["Associate"].ToString()) == "0")
{
var individual = new Individual();
}
else
{
var group = new Group();
}
return object;
}
如何動態地(取決於“ Associate
字段的值)創建個人或組?
如何實現具有所有通用屬性的接口?
就像是
interface IInterface
{
string CommonProperty1 { get; set; }
string CommonProperty2 { get; set; }
}
class Individual : IInterface
{
// ...
}
class Group : IInterface
{
// ...
}
public IInterface CreateObject(SqlDataReader indata)
{
if((indata["Associate"].ToString()) == "0")
{
var individual = new Individual();
// ...
return individual;
}
else
{
var group = new Group();
// ...
return group;
}
}
我建議您直接使用System.Type
。 根據您的實際需求,這里可以有多種更優雅的解決方案:
indata.GetFieldType(int ordinal)
將返回您字段的.NET類型 使用類型處理序列化數據 ,然后您可以在非通用反序列化之后簡單地獲取類型。 例如:
var result = JsonConvert.DeserializeObject(dataJson);
result
將具有您實際對象類型的類型。 您可以檢查它是否寫入result.GetType()並創建此類型的對象。 有關更高級的用法,請參見Activator.CreateInstance(...)
在大多數情況下,使用接口是最好的方法:
interface ISomething { // ... } class Individual : ISomething { // ... } class Group : ISomething { // ... }
然后,您以這種方式構建非泛型方法:
public ISomething CreateObject(SqlDataReader indata)
{
if((indata["Associate"].ToString()) == "0")
return new Individual();
else
return new Group();
}
您的通用對象創建可能看起來像這樣:
public T CreateObject<T>(SqlDataReader indata)
{
var o = new T();
return o;
}
其中T
是類型,您可以在此方法之外傳遞: CreateObject<YourType>(indata)
T
可以是您想要的任何類型,包括接口。 還與仿制葯的工作,你可以通過使用要檢查類型is
關鍵字,但我建議使用接口,避免is
檢查的。 例:
if(yourObject is YourType)
{
(yourObject as YourType).SomeSpecificToYourTypeMethod();
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.