[英]Cast and convert to a collection of base class objects not working
我正在嘗試做一件非常簡單的事情-將繼承的 class 對象的static 列表轉換為基本 class 對象的列表。 出於某種原因 - 結果,我總是得到繼承的 class 對象。 我可以看到即使在 lambda 表達式中調試時它也沒有轉換。 我在這里想念什么?
查看我的代碼:
這是包含 static 屬性的 class :
public class InheritedClassRepository
{
public static List<InheritedClass> RepoItems { get; set; }
}
這是繼承的 class:
public class InheritedClass: BaseClass
{
public InheritedClass() { }
public string someProperty { get; set; }
}
這是基礎 class:
public class BaseClass
{
public BaseClass() { }
public int DeviceId { get; set; }
[JsonProperty("Id")]
public int Id
{
get //For scheme reasons
{
return DeviceId;
}
}
}
這些是我嘗試過的所有鑄件和轉換:
List<BaseClass> a = InheritedClassRepository.RepoItems.Select(item =>
{
BaseClass A = (BaseClass)item;
return A;
}).ToList();
List<BaseClass> b = InheritedClassRepository.RepoItems.Select(item =>
{
BaseClass A = item as BaseClass;
return item as BaseClass;
}).ToList();
List<BaseClass> c = InheritedClassRepository.RepoItems.ConvertAll(item =>
{
BaseClass A = (BaseClass)item;
return (BaseClass)item;
});
List<BaseClass> e = InheritedClassRepository.RepoItems.Cast<BaseClass>().ToList();
List<BaseClass> f = InheritedClassRepository.RepoItems.ConvertAll(item =>
{
BaseClass A = (BaseClass)item;
return (BaseClass)item;
});
當您在類型層次結構中向上轉換和向下轉換時,object 的真正運行時類型保持不變。 您所做的稱為參考轉換。 它僅更改指向 memory 中 object 的引用類型。 實際的 object 保持不變。 與值類型不同,類型轉換涉及更改 object 標識,就像從int
到float
的轉換一樣,轉換只會更改引用的類型。
隱式或顯式引用轉換永遠不會更改被轉換的 object 的引用標識。 換句話說,雖然引用轉換可能會改變引用的類型,但它永遠不會改變被引用的 object 的類型或值。
如果您將列表元素記錄到控制台並看到InheritedClass
,那是因為Object.ToString()
定義如下:
public virtual String ToString()
{
return GetType().ToString();
}
來自https://github.com/microsoft/referencesource/blob/master/mscorlib/system/object.cs
GetType()
檢索 object 的真實運行時類型,無論其引用如何
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.