簡體   English   中英

將相同基類的不同對象傳遞給方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM