我有2个班级:
class A {
public void A_1(Object b) {
...
Type t = b.GetType();
(t.FullName)b.B_1(); //It doesn`t work! Error in cast
}
....
}
class B {
public void B_1() {
...
}
....
}
A a = new A();
B b = new B();
a.A1(b);
如何正确投射物体?
答案 0 :(得分:3)
如果要将任何类型的对象强制转换为其他类型的对象,请执行以下操作:
// Will Throw an exception at runtime if it cant be cast.
B newObject = (B)oldObject;
// Will return null at runtime if the object cannot be cast
B newObject = oldObject as B;
// If in a generic method, convert based on the generic type parameter regardless of condition - will throw an exception at runtime if it cant be cast
B newObject = (T)Convert.ChangeType(oldObject, typeof(T))
你的语法已关闭;如果没有从fullname转换为对象,只需从类型符号转换即可。
double x = (double)40;
ClassB anotherInstance = (ClassB)someOtherInstance;
答案 1 :(得分:3)
你要做的基本上是:
Foo myFoo = ("Foo")myObject;
这肯定不适用于C#。当您使用C#进行转换时,编译器会发出执行转换的代码,它需要知道它是从哪个转换为什么,以便编写该代码。字符串对这里的编译器没有帮助。
正如其他人所指出的,你想要做的事情似乎并不像你真正需要的那样(除非这只是一个人为的例子)。如果你真的想这样做,你需要使用比C#更动态的语言,或者找到一种C#友好的方式来实现这一目标。
答案 2 :(得分:2)
你确定你不想做(B)b.B_1()
吗?
答案 3 :(得分:2)
C#有一个静态类型系统,即所有类型必须在编译时知道(模反射)。因此,转换为仅在运行时知道的类型是没有意义的。明确指定类型:
public void A_1(object obj)
{
...
B b = (B)obj;
b.B_1();
// or
((B)obj).B_1();
}
答案 4 :(得分:1)
你也可以这样做:
class A {
public void A_1(Object b) {
...
if (b is B)
{
((B)b).B_1();
}
}
....
}
答案 5 :(得分:0)
Type.FullName
只是一个字符串;它不是一种类型。改为使用它:((B)b).B_1();
此外,使用GetType()
是一种动态获取对象类型的方法,但只有在编译时知道目标类型时才能进行转换(完全不是动态的) )。要进行强制转换,只需在一对括号中直接引用该类型即可。请勿尝试获取或使用Type
类型的对象。