首先,我确实有一个解决此问题的方法(使用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();


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是不相等的。

关于c# - 比较typeof(Type)与System.RuntimeType,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47861723/

10-17 01:04