簡體   English   中英

為什么對象在上傳時會保存屬性

[英]Why an object saves properties when upcasted

關於c#中的upcast,我有一個簡單的問題。 例如,我有兩個接口:

interface IUSer
{
    string UserName { get; set; }
}

interface IAdmin: IUSer
{
    string Password { get; set; }
}

...以及實現IAdmin接口的類:

class Admin : IAdmin
{
    public string Password { get; set; }
    public string UserName { get; set; }
}

當我創建一個Admin類型的對象並嘗試將其向上轉換為IUser時,從技術上講,我只能訪問UserName user.UserName:

var admin = new Admin() { UserName = "Arthur", Password = "hello" };
var user = (IUSer)admin;
Console.WriteLine( user.UserName );

...但是如果我使用Reflection循環遍歷此對象的屬性,就像這樣:

    private static void Outputter(IUSer user)
    {
        foreach (var prop in user.GetType().GetProperties())
        {
            Console.WriteLine(prop.Name +  " " + prop.GetValue(admin));
        }
    }

...我也可以看到密碼屬性。 問題是 - 為何在升級時保存?

問題是 - 為何在升級時保存?

因為鑄造根本不會改變對象 它只會改變您查看對象的方式。

把它想象成一個人。 您可能有不同的方式讓人們可以看到您:

  • 一個同事
  • 經理
  • 一位家庭成員
  • 一個朋友

他們只“看到”你的某些方面,但這不會改變你的身份。

同樣,簡單的引用轉換不會更改對象。 如果你調用user.GetType()它仍然會報告對象的實際類型。 只是當您通過特定鏡頭(無論是界面還是基類)查看對象時,您只能看到鏡頭向您顯示的成員。

(請注意,調用用戶定義的轉換的轉換,例如從XElement轉換為string ,完全不同。它返回對新對象的引用,而不是僅以不同的方式關注現有對象。)

如果您只想查看IUser屬性,請使用typeof(IUser).GetProperties()而不是先調用GetType()

private static void Outputter(IUser user)
{
    foreach (var prop in typeof(IUser).GetProperties())
    {
        Console.WriteLine($"{prop.Name}: {prop.GetValue(user)}");
    }
}

雖然我不確定在大多數情況下用反射來做這件事特別有用。

當你將任何類型的對象強制轉換為它們的基類型時,你只需要保持那個對象類型為base的對象。

對象不會因此而忽略其屬性。

如果您看到一個最簡單的示例: 使用非泛型集合

當您在ArrayList添加一些對象(比如Admin類)時,您實際上是將該對象轉換為類型object (Boxing),然后將其存儲為arraylist。 所以這是上傳的最終例子! 怎么樣?

對象類型是.NET Framework中Object的別名。 在C#的統一類型系統中,所有類型,預定義和用戶定義的引用類型和值類型都直接或間接地從Object繼承。

全職

現在, object類型不包含userName password等屬性。 因此,當您嘗試從arraylist直接獲得的對象訪問這些屬性時,您將無法執行此操作。 因為當前您正在處理類型object並且您只能訪問object類型支持的那些屬性或成員(但是在這里您無法訪問,但仍然存在這些屬性)。 另外作為其他答案中的注釋GetType()方法也一定會返回它的原始類型。

但是,當您將該原始對象從陣列列表中返回到Admin類型(取消裝箱)時,您將看到這些屬性在您的對象中,就像之前一樣。 只有更改的是,現在您可以訪問它們,因為Admin類型支持它們。

閱讀本文了解更多詳情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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