c#中的类型转换问题

时间:2011-05-03 15:14:51

标签: c# casting

我有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);

如何正确投射物体?

6 个答案:

答案 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类型的对象。