簡體   English   中英

將 typeof(Type) 與 System.RuntimeType 進行比較

[英]Comparing typeof(Type) to System.RuntimeType

首先,我確實有解決這個問題的方法(使用 type.FullName),所以它只是為了利益。

*為澄清而編輯; 這實際上只是一個比較代碼中類型類型的最佳方法的問題。

object o;
Type t = typeof(someclass);
o = t;

// Cant do this
if (o.GetType() == typeof(RuntimeType)) {
}

附加到 o 的對象可以是任何東西,包括類型。 我正在檢查對象的類型以了解如何進一步處理它。 所以如果它是一個字符串,我可能會做一件事,如果它是一個枚舉,如果它是一個類型,我可能會做另一件事。 我基本上在處理與 String.Format("",x,y,z) 相同的事情,其中​​參數都是完全任意的。

我可以寫

if (o.GetType().FullName == "System.RuntimeType") {} or
if (o.GetType()== typeof(Type).GetType()) {}

但兩者都非常難看(盡管它有效)。

原始問題:

抱歉,如果之前有人問過這個問題,但我找不到完全匹配的問題(有很多如何獲取對象類型、對象是類或 object.GetType() 樣式的問題。)

這個問題很接近,但它並不完全相同,因為我無法避免在類型上調用 GetType(我不認為?希望我沒有忽略一些非常簡單或欺騙性的東西......); C# 中的 System.Type 和 System.RuntimeType 有什么區別?

所以基本上,我創建了一個帶有任意數量參數的屬性。 這些可以是任何對象,包括類型(我使用類型來決定應該如何處理屬性附加到的屬性)。 例如,雖然屬性可以是整數,但該整數是數據庫中某個特定表的主鍵。 如果我將這種類型分配給屬性,我可以編寫通用代碼來處理任何類型的對象,而無需編寫大量特殊情況代碼。 也就是說,我可以使用字符串或任何其他值,例如枚舉,但由於模型已經存在,因此似乎沒有任何意義不使用它們,因為我可以使用 Activator.CreateContext() 基於創建它們的實例傳入的類型。

[AttributeUsage(AttributeTargets.Property)]
public class SomeAttribute: System.Attribute
{
    public SomeAttribute(params object[] parameters)
    {
        foreach(var p in parameters) {
            ...
            // Type of Type.  Uh oh.
            Type t = p.GetType();

            // Evaluates as false when t is of type Type(its actually RuntimeType, with is protected). Sad face.
            if (t == typeof(Type)) {
                ...
            }
            ...
        }
    }
}

我已經在一些屬性上添加了這個屬性;

public class someclass
{
    [SomeAttribute(..., typeof(someotherclass))
    public sometype someproperty { get; set; }
}

當程序到達

if (t == typeof(Type))

如果總是返回 false。 t 的類型被評估為 System.RuntimeType 而不是 System.Type。 不幸的是,我不能將其更改為

if (t == typeof(RuntimeType))

由於我收到“'RuntimeType' 由於其保護級別而無法訪問”的編譯器錯誤。

除了查看 type.Name 或 type.FullName 之外,還有什么方法可以對 RuntimeType 執行類型匹配?

*重新編輯以獲得更多說明。

考慮到Type是一個普通的類。

Type t1 = typeof(string);
Type t2 = "1".GetType();

t1t2之間沒有區別。 什么是t1 只需將t1t2視為普通對象,並且對象的類型為System.Type 這意味着t1t2幾乎等於new Type("System.String")

我怎么知道對象objStringBuilder

只需使用isas

bool objIsStringBuilder = obj is StringBuilder;

我怎么知道t1Type

以相同的方式:

bool t1IsType = t1 is Type;

什么是typeof(Type)t1.GetType()

Type t3 = typeof(Type);

那么t3幾乎等於new Type("System.Type") 因此,當然t1t3不相等。

我想我應該在今天早上喝更多的咖啡或睡覺。 盡管看起來與使用type.FullName一樣錯誤,但此方法有效。

if (t == typeof(Type).GetType()) {
}

那好吧。

為了測試變量是否是Type ,請使用typeof(Type).IsAssignableFrom(x) 如果xtypeof(Type)typeof(RuntimeType) ,則此表達式返回true ,但對於typeof(string)等其他類型則返回false

Type x = typeof(string);
Type y = typeof(Type);
Type z = typeof(Type).GetType(); // RuntimeType

typeof(Type).IsAssignableFrom(x); // false;
typeof(Type).IsAssignableFrom(y); // true;
typeof(Type).IsAssignableFrom(y); // true;

x is Type; // true;
y is Type; // true;
z is Type; // true;

表達式x is Type ,它會為所有類型返回true ,例如typeof(Type)typeof(string)

這有什么用? 想象一下,您必須在無法訪問原始對象的情況下找到類型的Type ,例如:

object[] objects = {"hello", typeof(string), 5}; 
Type[] types = objects.Select(x => x.GetType()).ToArray();

// Imagine we are given the `types` array with a task to get indices of types.

for (int i = 0; i < types.Length; ++i) {
  if (typeof(Type).IsAssignableFrom(types[i])) {
    Console.WriteLine($"Object at index {i} is Type!");
  }
}
// prints: "Object at index 1 is Type!"

暫無
暫無

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

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