![](/img/trans.png)
[英]Xamarin.Android - typeof and GetType always return 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();
t1
和t2
之間沒有區別。 什么是t1
? 只需將t1
或t2
視為普通對象,並且對象的類型為System.Type
。 這意味着t1
或t2
幾乎等於new Type("System.String")
。
obj
是StringBuilder
? 只需使用is
或as
:
bool objIsStringBuilder = obj is StringBuilder;
t1
是Type
? 以相同的方式:
bool t1IsType = t1 is Type;
typeof(Type)
或t1.GetType()
? Type t3 = typeof(Type);
那么t3
幾乎等於new Type("System.Type")
。 因此,當然t1
和t3
不相等。
我想我應該在今天早上喝更多的咖啡或睡覺。 盡管看起來與使用type.FullName一樣錯誤,但此方法有效。
if (t == typeof(Type).GetType()) {
}
那好吧。
為了測試變量是否是Type
,請使用typeof(Type).IsAssignableFrom(x)
。 如果x
是typeof(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.