动态铸造
为什么最后两个行不行,给我动态铸造
类型或命名空间名称“的myType”找不到
Type myType = this.GetType();
bool test = obj is myType;
var p = (myType)obj;
你需要做的:
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()
),那么就没有点转换,实际上这是不可能的。
我没有视觉工作室现在准备好了,这不是我经常需要做的事情,但对于第二行我认为它应该看起来像这样:
bool test = obj is typeof(this);
除非您有一组您可以打开的可能类型,否则第三行是不可能的。
对象的类型被转换为必须在C#编译时确定。您正尝试基于与此概念不兼容的对象的运行时类型进行强制转换。因此你会得到这个错误。
你能举一个你想用p
做什么的例子吗?有可能是一个更干净的方式。
如果你想知道,如果一个对象是一个实例或Type
在运行时的实施,你需要做的:
从那里,没有办法施展对象因为编译器在编译时需要这些信息,所以它是一种运行时类型。但是,如果您使用的是C#4,则可以使用dynamic
类型。
Type thisType = this.GetType();
Type objType = obj.GetType();
if(objType.IsAssignableFrom(type))
{
dynamic dynObj = obj;
dynObj.CallWhateverIWant();
}
然而,看着你的代码,显然有更好的方法来做你想要做的事情。也许你可以实现某种类型的接口,这两个类都通用,并且在编译时使用该接口的函数。
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;
第二个到现在仍然不做些什么的OP想要。 – 2010-12-15 20:08:02
@JoelCoehoorn谢谢纠正了答案。 – 2014-11-10 17:24:56