簡體   English   中英

轉換並轉換為基本 class 對象的集合不起作用

[英]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;
});

您可以嘗試使用以下代碼:

List<BaseClass> a = InheritedClassRepository.RepoItems.Select(item =>
            {
                BaseClass A = new BaseClass {DeviceId=item.DeviceId};
                return A;
            }).ToList();

結果: 在此處輸入圖像描述

當您在類型層次結構中向上轉換和向下轉換時,object 的真正運行時類型保持不變。 您所做的稱為參考轉換。 它僅更改指向 memory 中 object 的引用類型。 實際的 object 保持不變。 與值類型不同,類型轉換涉及更改 object 標識,就像從intfloat的轉換一樣,轉換只會更改引用的類型。

來自Microsoft Docs C# 語言參考

隱式或顯式引用轉換永遠不會更改被轉換的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM