我有一个名为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级和集会由第三方提供。
提前致谢:)
答案 0 :(得分:4)
根据您的层次结构,您必须编写转换运算符。一般来说,没有内置的方法可以做到这一点(想想Dog : Animal
和Cat : 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);
会复制b
到a
之间的所有常见属性。
答案 1 :(得分:2)
要将B
转换为A
,B
必须继承 A
。即使B
包含A
的所有属性,它仍然不是A
。
答案 2 :(得分:1)
您可以使用适配器模式
答案 3 :(得分:0)
如果B无法转换为A(如B is A
中所示)
如果不继承A,就不可能实现你想做的事。不幸的是,与许多动态语言(即Ruby)不同,C#不支持duck typing。
答案 4 :(得分:-1)
您可以继承A类:
public class B : A {
}
如果你需要覆盖一些方法/属性,只需在A类中将它们设置为virtual
。
答案 5 :(得分:-1)
我认为你实际上做不到。
为什么不将属性添加到部分类A?