繁体   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