在C#中保留基类后,对象变为null

时间:2016-10-18 23:29:36

标签: c# generics inheritance dynamic

我试图通过使用虚方法创建一个通用DAO类来减少项目数据层(类库)中的代码,这样我就可以为所需的各种类型实现此类的实现。

为简单起见,我只会为所有类编写read方法,只编写必要的参数。

一个要求是用作此层中所有方法的返回的对象,这是一个通用类,如下所示:

public class ReturnObject<T>
{
    public T Object { get; set; }
}

我开始使用IDao接口:

public interface IDao<T>
{
    ReturnObject<T> Read(Guid id);
}

然后,&#34;默认实施&#34;:

public abstract class Dao<T> : IDao<T>
{
    // Database context.
    protected Context Context { get; } = new Context();

    public virtual ReturnObject<T> Read(Guid id)
    {
        // Creating return object.
        var returnObject = new ReturnObject<dynamic>();

        // Reading entity from database.
        try
        {
            switch (typeof(T).ToString())
            {
                case "Foo":
                    returnObject.Object = Context.Foos.First(o => o.Id == id) as dynamic;
                    break;

                case "Bar":
                    returnObject.Object = Context.Bars.First(o => o.Id == id) as dynamic;
                    break;
            }
        }
        catch (Exception exception)
        {
            ...
        }
        finally
        {
            ...
        }

        // Returning result.
        return returnObject as ReturnObject<T>;
    }
}

所以,基本上这是我试图获得的代码减少。基于 T 类类型,我将能够从上下文切换正确的集合,将读取的对象存储到returnObject中,然后将其发送回调用者。

出于组织和其他原因,我还有几个继承的类,如下所示:

public class DaoFoo : Dao<Foo>
{
}

最后,我的问题。我很肯定我在这里误解了一些概念,这就是为什么我在调用方法时会得到空值,如下所示:

public class FooController : ApiController
{
    public IHttpActionResult Get(Guid id)
    {
        var foo= new DaoFoo().Read(id);

        return Content(HttpStatusCode.OK, new foo.Object); 
    }
}

调试时我可以看到 Dao 类正在发送正确的对象及其所有参数,如图所示:

enter image description here

然而,调用方法总是得到 null ,就像在图像中一样:

enter image description here

尽管如此,有人能指出我在这里做错了什么吗? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

您将动态视为ReturnObject而导致null,因为它无法将一种类型转换为另一种类型。

尝试不使用动态,你的方法是通用的,所以使用T代替,所以你不必投射

答案 1 :(得分:1)

returnObjectReturnObject<object>,但returnObject as ReturnObject<T>为空。如果提供的值不是指定类型,则as运算符将返回null。