2010-12-15 155 views
3

为什么最后两个行不行,给我动态铸造

类型或命名空间名称“的myType”找不到

Type myType = this.GetType(); 

bool test = obj is myType; 
var p = (myType)obj; 

回答

4

你需要做的:

bool test = myType.IsInstanceOfType(obj); 

bool test = myType.IsAssignableFrom(obj.GetType()); 
// var p = Convert.ChangeType(obj, myType); - update: this is not what the OP asked 

对于第二个,你不能“投”的表达式未在编译时已知的类型。转换的重点是在本地引用该类型的成员。如果你不知道编译类型是什么类型的(因为你使用的是.GetType()),那么就没有点转换,实际上这是不可能的。

+2

第二个到现在仍然不做些什么的OP想要。 – 2010-12-15 20:08:02

+1

@JoelCoehoorn谢谢纠正了答案。 – 2014-11-10 17:24:56

0

我没有视觉工作室现在准备好了,这不是我经常需要做的事情,但对于第二行我认为它应该看起来像这样:

bool test = obj is typeof(this); 

除非您有一组您可以打开的可能类型,否则第三行是不可能的。

1

对象的类型被转换为必须在C#编译时确定。您正尝试基于与此概念不兼容的对象的运行时类型进行强制转换。因此你会得到这个错误。

你能举一个你想用p做什么的例子吗?有可能是一个更干净的方式。

1

如果你想知道,如果一个对象是一个实例Type在运行时的实施,你需要做的:

​​

从那里,没有办法施展对象因为编译器在编译时需要这些信息,所以它是一种运行时类型。但是,如果您使用的是C#4,则可以使用dynamic类型。

Type thisType = this.GetType(); 
Type objType = obj.GetType(); 

if(objType.IsAssignableFrom(type)) 
{ 
    dynamic dynObj = obj; 
    dynObj.CallWhateverIWant(); 
} 

然而,看着你的代码,显然有更好的方法来做你想要做的事情。也许你可以实现某种类型的接口,这两个类都通用,并且在编译时使用该接口的函数。

3

C#是一种静态类型语言,它意味着编译时必须知道类型。关键字var只是意味着“找出这种类型应该在编译时自动(通过推理)”。

任何强制类型转换或类型检查必须针对静态类型。实际上,您正尝试使用描述类型的Type类型的对象的实例。那个例子是由你提供给你的。NET反射。

一旦您使用运行时派生类型的对象,您必须对该实例上的所有操作使用反射。例如,你可以这样做:

bool test = myType.IsInstanceOfType(obj); 
bool test = typeof(obj).IsAssignableFrom(myType); // Good for checking if a type implements an interface 

关于你的第二行,你可以使用object参考举行任何类型:

object p = obj;