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