5

我有一类名为 A 和一类 B

public class A : UserControl { }

public class B : UserControl { }

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

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

如果我有这样的事情(A)objB是不允许的。然后我尝试了这个:

UserControl control = objB as UserControl;

A objA = control as A;

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

为避免混淆:A 级和组装由第 3 方提供。

提前致谢 :)

4

6 回答 6

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

b这将复制到之间的所有公共属性a

于 2010-11-23T15:58:52.743 回答
2

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

于 2010-11-23T16:00:03.753 回答
1

您可以使用适配器模式

看这里

于 2010-11-23T15:58:35.317 回答
0

如果 B 不能强制转换为 A(如 中),那么如果不从 A 继承,就不可能实现您想要做的事情。不幸的是,与许多动态语言(即 Ruby)不同B is A,C# 不支持鸭子类型。

于 2010-11-23T15:59:23.730 回答
-1

您可以从 A 类继承:

public class B : A {
}

如果您需要覆盖某些方法/属性,只需将它们设置为virtualA 类。

于 2010-11-23T15:58:39.140 回答
-1

我认为你实际上做不到。

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

于 2010-11-23T16:00:25.490 回答