我试图通过使用虚方法创建一个通用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 类正在发送正确的对象及其所有参数,如图所示:
然而,调用方法总是得到 null ,就像在图像中一样:
尽管如此,有人能指出我在这里做错了什么吗? 提前谢谢!
答案 0 :(得分:1)
您将动态视为ReturnObject而导致null,因为它无法将一种类型转换为另一种类型。
尝试不使用动态,你的方法是通用的,所以使用T代替,所以你不必投射
答案 1 :(得分:1)
returnObject
是ReturnObject<object>
,但returnObject as ReturnObject<T>
为空。如果提供的值不是指定类型,则as
运算符将返回null。