[英]Which is better for subquery, using entity assigned var or accessing entity directly?
[英]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>();
您正在做兩件事:
GetInstanceOf
返回的object
顯式轉換為EntityBaseSupertype
,如果返回的Type
對於該InvalidCastException
無效,則將拋出InvalidCastException
。 EntityBaseSupertype
Type
的變量。 然后,成員查找可以找到EntityBaseSupertype
及其基礎類的成員。
一些注意事項:
GetInstanceOf<T>
將始終返回Type
T
的object
,因此您應將其簽名更改為:
public static T GetInstanceOf<T>() where T : class
如果它可能返回不是T
的Type
,則此方法存在風險,因為將調用該方法的代碼可能會得到意外的結果,並且不應該自己進行強制轉換。
在這種情況下,您應該考慮使用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.