![](/img/trans.png)
[英]C# and inheritance. Base class property is null when the object is Extended class object
[英]Object becoming null after leaving base class in C#
我試圖通過使用虛擬方法制作一個通用的DAO類來減少項目數據層(類庫)中的代碼,這樣,我將為所需的各種類型提供此類的實現。
為簡單起見,我將只為所有類和必需的參數編寫read方法。
一個要求是將該對象用作該層內所有方法的返回,該對象是如下的通用類:
public class ReturnObject<T>
{
public T Object { get; set; }
}
我從IDao接口開始:
public interface IDao<T>
{
ReturnObject<T> Read(Guid id);
}
然后,“默認實現”:
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 ,如圖所示:
綜上所述,有人可以指出我在這里做錯了什么嗎? 提前致謝!
您將dynamic轉換為ReturnObject,結果為null,因為它無法將一種類型轉換為另一種類型。
嘗試不使用動態方法,因為您的方法是通用的,所以使用T代替,因此您不必強制轉換
returnObject
是ReturnObject<object>
,但returnObject as ReturnObject<T>
為null。 如果提供的值不是指定的類型,則as
運算符將返回null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.