![](/img/trans.png)
[英]Passing different objects of the same parent class to a constructor/method that hosts a generic derived class object
[英]passing different objects of same base class to method
基本上,我想創建一個方法,該方法將基類作為參數,並且可以對派生類使用“泛型”
ef-code-first類:
基類
public abstract class BaseClass
{
public int Id { get; set; }
public string Name { get; set; }
}
派生類:
public class DerivedA:BaseClass
{
public string AValue {get;set;}
...more specific fields
}
public class DerivedB:BaseClass
{
public string BValue {get;set;}
..... more specific fields
}
我用這些稍有不同的對象稱為“通用方法”:
System.Data.Entity.DbSet<DerivedA> _dA....
System.Data.Entity.DbSet<DerivedB> _dB....
genericMethod(_dA.Where(a => a.Name.StartsWith("a name")))); //<-contains records
genericMethod(_dB.Where(a => a.Id==5)); //<---- contains records
兩個“ Where ...”都包含調試中的記錄(單擊“枚舉”后)
現在的方法:
public string genericMethod(<IQueryable>BaseClass _myClass)
{
foreach (BaseClass c in _myClass) // <-------class is empty - no records
{
// do something usefull...
}
return someResult
}
但是,在方法內部時,不包含任何記錄。
我正在嘗試做... 是否有意義?
沒有設計時或編譯時或運行時錯誤,但是所傳遞的對象在傳遞給方法時不包含任何記錄,但是在調用語句中包含記錄。
我做錯了什么?
有沒有更好的方法? --
我需要此方法來處理兩個以上(也許十個)派生類,因此我希望它是“泛型”的。
謝謝!
當遇到這樣的事情時,我想簡化我的代碼。
我會嘗試從方法調用中刪除_dA.Where(a => a.Name.StartsWith("a name"))
和_dB.Where(a => a.Id==5)
並將它們首先放入變量中(然后將變量傳遞給方法)。
這將使您能夠更好地檢查您的代碼,甚至可以闡明問題所在。
在將查詢傳遞給方法之前,添加.ToList()來實現查詢:
genericMethod(_dA.Where(a => a.Name.StartsWith("a name"))).ToList());
否則,您實際上並沒有傳遞查詢的結果,只是傳遞了需要首先評估的查詢。 ToList()將為您評估它。 當您查看調試器手表時,它基本上是在為您動態評估它,這就是為什么您看到返回的行。
之后,更改您的方法以處理IList而不是IQueryable。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.