我一类命名为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和组件由第三方提供的。

在预先感谢:)

有帮助吗?

解决方案

由于您的层次结构,你将不得不写一个转换操作符。有没有内置的方式做到这一点一般的(认为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);

这将b之间复制所有共同属性a

其他提示

有关B是可浇注到一个AB继承 A。即使B包含A的所有属性,但它仍然不是一个A

你可以使用一个适配器模式

参见这里

如果B不能被转换为A(如B is A) 这是不可能实现的目标,你正在尝试做的,而不从A继承不幸的是C#不支持鸭打字不像许多动态语言(即红宝石)。

可以从类A继承:

public class B : A {
}

如果你需要overrride一些方法/属性只是将它们设置为virtual A类。

我觉得你其实无法做到这一点。

为什么不将您的属性的局部类A?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top