簡體   English   中英

訪問分配給var的實體的屬性

[英]Accessing properies of an Entity assigned to a var

請幫助我理解這一點。 我有一個看起來像這樣的工廠

public static class  FactoryForAnything
{
    public static object GetInstanceOf<T>() where T : class
    {
         return Activator.CreateInstance(IsType<T>(), true);
    } 
    private static Type IsType<T>()
    {
        if (typeof(T).IsSubclassOf(typeof(EntityBaseSupertype)) == true)
        {
            return typeof(T);
        }
        else if (typeof(T).IsSubclassOf(typeof(ValueObject<>)) == true)
        {
            return typeof(T);
        }
        else
            return null;
    }

意向接受一個類作為參數並返回該類的對象

EntityBaseSupertype hon =(EntityBaseSupertype) FactoryForAnything.GetInstanceOf<User>(); 
var hon = FactoryForAnything.GetInstanceOf<User>();

用EntityBaseSupertype調用工廠可以獲取該對象,並且所有實體的抽象基類都引用了該對象,因此我可以訪問該對象的文件/屬性/成員。 用var調用工廠會得到對象,但它不能讓我訪問字段/屬性等。 我知道這是一個丑陋的設計,將不會使用,但是我的問題在於,為什么我不能使用var訪問對象? 這是為什么 ?

首先, var只是一個關鍵字,用於在聲明變量時縮短已知Type所需的編寫。 這意味着編譯器將根據用法確定變量的顯式類型。 因此,在您的代碼行中:

var hon = FactoryForAnything.GetInstanceOf<User>();

等效於:

object hon = FactoryForAnything.GetInstanceOf<User>();

因為編譯器(以及IntelliSense )基於訪問的變量的Type進行成員查找,所以在這種情況下為object (或其基類之一)。由於……這是object和不存在,所以不存在它沒有基類)。

編譯以下代碼時:

EntityBaseSupertype hon = (EntityBaseSupertype) FactoryForAnything.GetInstanceOf<User>();

您正在做兩件事:

然后,成員查找可以找到EntityBaseSupertype及其基礎類的成員。


一些注意事項:

  • GetInstanceOf<T>將始終返回Type Tobject ,因此您應將其簽名更改為:

     public static T GetInstanceOf<T>() where T : class 

    如果它可能返回不是TType ,則此方法存在風險,因為將調用該方法的代碼可能會得到意外的結果,並且不應該自己進行強制轉換。

  • 在這種情況下,您應該考慮使用IsAssignableFrom而不是IsSubclassOf來支持協方差對比度

  • 使用as關鍵字轉換返回的值更安全,因為失敗時返回null ,而不是拋出InvalidCastException

  • 命名非布爾方法IsXXXXX會使代碼的可讀性降低,因此,代碼的可維護性也會降低, IsType方法也會返回null ,這可能導致您的其他方法在Type無效時引發非指示性Exception

編譯器嘗試根據代碼確定var的真實類型,但對於

var hon = FactoryForAnything.GetInstanceOf<User>();

object是它能做的最好的事情。 編譯器無權訪問對象元數據,因為它實際上沒有執行和傳遞對象實例。

您可以使用以下方法檢查元數據

EntityBaseSupertype hon =  FactoryForAnything.GetInstanceOf<User>() as EntityBaseSupertype;

但這是運行時檢查。 編譯器會將hon解釋為EntityBaseSupertype並允許您訪問公共屬性和成員。 CLR將在運行時查看對象元數據,如果該對象不可分配給EntityBaseSupertype ,則返回null,而如果該對象不可分配,則強制轉換將拋出InvalidCastException。

暫無
暫無

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

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