将一个对象转换为另一种类型

时间:2010-11-23 15:54:57

标签: c# user-controls casting as-operator

我有一个名为A的班,一个班B

public class A : UserControl { }

public class B : UserControl { }

现在我有一个程序集,其类的函数接受A类的对象。这个程序集不是由我创建的,所以我没有任何控制。基本上它是第三方组装。

但我想提供我的B类对象,因为它是有点自定义的。请放心,它包含A类的所有属性。如何将类B的对象类型转换为A类,以便我可以在项目中集成第三方程序集,并根据需要自定义外观?

如果我像(A)objB这样的东西是不允许的。然后我尝试了这个:

UserControl control = objB as UserControl;

A objA = control as A;

但在这种情况下的问题是objA为空。

为避免混淆:A级和集会由第三方提供。

提前致谢:)

6 个答案:

答案 0 :(得分:4)

根据您的层次结构,您必须编写转换运算符。一般来说,没有内置的方法可以做到这一点(想想Dog : AnimalCat : Animal):

public static explicit operator A(B b) {
    // code to populate a new instance of A from b
}

您还可以使用通用反射框架并执行类似

的操作
public static void PropertyCopyTo<TSource, TDesination>(
    this TSource source,
    TDestination destination
) {
    // details elided
}

所以你可以说

// b is B
// a is A
b.PropertyCopyTo<A>(a);

会复制ba之间的所有常见属性。

答案 1 :(得分:2)

要将B转换为AB必须继承 A。即使B包含A的所有属性,它仍然不是A

答案 2 :(得分:1)

您可以使用适配器模式

See Here

答案 3 :(得分:0)

如果B无法转换为A(如B is A中所示) 如果不继承A,就不可能实现你想做的事。不幸的是,与许多动态语言(即Ruby)不同,C#不支持duck typing

答案 4 :(得分:-1)

您可以继承A类:

public class B : A {
}

如果你需要覆盖一些方法/属性,只需在A类中将它们设置为virtual

答案 5 :(得分:-1)

我认为你实际上做不到。

为什么不将属性添加到部分类A?