首先,我确实有一个解决此问题的方法(使用type.FullName),因此仅出于兴趣考虑。
*为澄清而编辑;这实际上只是一个比较代码中Type类型的最佳方法的问题。
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(我不认为?希望我不会忽略真正简单或欺骗的东西……)而导致的问题不尽相同。
What's the difference between System.Type and System.RuntimeType in C#?
因此,基本上,我创建了一个具有任意数量参数的属性。这些可以是任何对象,包括类型(我使用类型来决定应如何处理附加属性的属性)。例如,虽然属性可以是整数,但该整数是数据库中某些特定表的主键。如果将这种类型分配给属性,则可以编写通用代码来处理任何类型的对象,而不必编写大量特殊情况的代码。就是说,我可以使用字符串或任何其他值(如枚举),但是由于模型已经存在,因此似乎没有任何理由不使用它们,因为我可以基于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
是不相等的。关于c# - 比较typeof(Type)与System.RuntimeType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47861723/