【发布时间】:2017-12-18 03:21:39
【问题描述】:
首先,我确实有解决这个问题的方法(使用 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(我不认为?希望我没有忽略一些非常简单或欺骗性的东西......); 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 执行类型匹配?
*重新编辑以获得更多说明。
【问题讨论】:
-
你能给我们更多关于你的代码用例的上下文吗?很难说为什么您的比较总是与您提供给我们的信息返回错误。
-
好像
if (p is Type) { -
它用于审计对对象所做的更改。具有该属性的对象中的任何属性都会与之前的状态进行比较,如果它们不同,则会在审核日志中创建一个条目,记录更改内容和更改对象。如果您删除 ...,上面的代码应该可以毫无问题地编译。好吧,除非我在某个地方打错了字。问题的要点是真的“t.Name == "RuntimeType" 很丑(就像 t == typeof(Type).GetType().
-
if (p is Type) { ... } 可能是这样。使用它会导致应用程序目前在代码的其他位置向我抛出运行时错误。我会追上去看看是怎么回事。
-
猜猜我今天脑子有问题。我不能使用 if (p is Type) 的原因是因为它不仅匹配类型 Type,它还匹配所有其他类型,例如它匹配 typeof(string)。这就是我收到运行时错误的原因。
标签: c#