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

TCM*_*TCM 5 c# user-controls casting as-operator

我有一个名为A的班级和一个班级B.

public class A : UserControl { }

public class B : UserControl { }
Run Code Online (Sandbox Code Playgroud)

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

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

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

UserControl control = objB as UserControl;

A objA = control as A;
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下的问题是objA是null.

为避免混淆:A类和汇编由第三方提供.

提前致谢 :)

jas*_*son 4

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

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

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

public static void PropertyCopyTo<TSource, TDesination>(
    this TSource source,
    TDestination destination
) {
    // details elided
}
Run Code Online (Sandbox Code Playgroud)

那么你可以说

// b is B
// a is A
b.PropertyCopyTo<A>(a);
Run Code Online (Sandbox Code Playgroud)

这会将之间的所有公共属性复制ba