C#从接口转换类型

时间:2012-04-04 14:28:12

标签: c# class interface casting

我想创建一组非常相似的类,并且可以转换为其他类型。我的想法是我将创建一个Interface对象并通过基类实现它。然后创建从我的基础继承的其他类。然后,我可以使用Interface来处理公共(基础)方法,并将BASE对象中的对象转换为自定义类型。

interface ImyInterface {

}

public class MyBase : ImyInterface {

}

public class MyCustom1 : MyBase {

}

public class MyCustom2 : MyBase {

}


// in helper class
public static MyBase GetGeneralOjbect() {

    // get a generic base object
    return new MyBase();
}

// How I'm trying to use this

MyCustom1 obj = GetGeneralOjbect() as MyCustom1;

除了转换对象语句之外,这似乎有效。即使静态助手GetGeneralOjbect返回一个好的MyBase对象,MyCustom1也始终为null。也许这不可能做到,或者我没有正确地做到这一点。任何意见都将不胜感激。

5 个答案:

答案 0 :(得分:3)

这是因为您可以将MyCustom1MyCustom2投射到MyBase,但不一定是另一种方式。

当您通过MyBase创建MyBase b = new MyBase();时,bMyBase而不是MyCustom2,因此将b投射到{{} 1}}会失败。

可以做的是:

MyCustom2

无法做的是:

MyBase b = new MyCustom2();
MyCustom2 c = b as MyCustom2();

答案 1 :(得分:1)

基本上你可以建立一个继承链而不是它。说你有以下课程heirarchy:

public class A {
}

public class B : A {
}

public class C : B {
}

如果您实例化了类型B的新实例,则可以将其强制转换为A而不是C.

答案 2 :(得分:1)

“as”关键字表示“如果这个静态类型为MyBase的对象具有MyCustom1的运行时类型,那么将它静态地返回给我作为MyCustom1;否则,给我一个空引用”。您正在投射的对象具有运行时类型MyBase,而不是MyCustom1,这就是您获得空引用的原因。

答案 3 :(得分:0)

您是否考虑过使用工厂模式?

答案 4 :(得分:0)

只要预期MyCustom1的实例,就可以使用MyBase的实例,但在预期MyBase时无法使用MyCustom1