将相同基类的不同对象传递给方法

时间:2012-10-24 20:40:55

标签: c# asp.net-mvc entity-framework

基本上,我想创建一个Method,它将一个基类作为参数,并且可以对派生类使用“generic”

ef-code-first classes:

基类

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 
}

但是在方法内部没有包含记录。

有可能,我想做什么......? 它有意义吗?

没有设计时或编译时或运行时错误,但传递的对象在传递给方法时不包含任何记录,但它包含调用语句中的记录。

我做错了什么?

有更好的方法吗? -

我需要这个方法,用于操作两个以上(可能十个)派生类,因此我希望它“通用”。

谢谢!

2 个答案:

答案 0 :(得分:1)

当面对这样的事情时,我喜欢简化我的代码。

我会尝试从方法调用中删除_dA.Where(a => a.Name.StartsWith("a name"))_dB.Where(a => a.Id==5),然后将它们放入变量中(然后将变量传递给方法)。

这将使您能够更好地检查您的代码,并可能解决问题。

答案 1 :(得分:0)

添加.ToList()以在将查询传递给方法之前实现查询:

genericMethod(_dA.Where(a => a.Name.StartsWith("a name"))).ToList());

否则,您实际上并未传递查询结果,而只是传递需要首先评估的查询。 ToList()将为您评估它。当你查看调试器手表时,它基本上是为你动态评估它,这就是你看到返回行的原因。

之后,更改您的方法以处理IList而不是IQueryable。