首先,我确实有一个解决这个问题的方法(使用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()) {}
但两者看起来都很难看(尽管它很有效)。
原始问题:
如果之前已经问过这个问题,请道歉,但我找不到完全匹配(我有很多如何获得一种对象,对象是类或对象.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'由于其保护等级而无法进入"
有没有办法在RuntimeType上执行类型匹配,而不是通过查看type.Name或type.FullName?
*需要进行更多澄清。
答案 0 :(得分:3)
Consider Type
is a normal class.
Type t1 = typeof(string);
Type t2 = "1".GetType();
There's no difference between t1
and t2
. And What is t1
? Just consider t1
or t2
as a normal object and the type of the object is System.Type
. It means that t1
or t2
nearly equals new Type("System.String")
.
obj
is aStringBuilder
?Just use is
or as
:
bool objIsStringBuilder = obj is StringBuilder;
t1
is a Type
?In the same way:
bool t1IsType = t1 is Type;
typeof(Type)
or t1.GetType()
?Type t3 = typeof(Type);
Then t3
is nearly equals new Type("System.Type")
. So of course t1
and t3
are not equal.
答案 1 :(得分:0)
我想我今天早上应该喝更多咖啡或睡觉。这虽然看起来和使用type.FullName一样错误。
if (t == typeof(Type).GetType()) {
}
哦,好吧。