C# 两个类型共享一个公共基类型的重铸

C# 两个类型共享一个公共基类型的重铸,c#,casting,C#,Casting,我们有如下代码: class Base { public string Name; } class DeeperBase : Base { } class A : Base { public A() { Name = "A"; } } class B : DeeperBase { public B()

我们有如下代码:

    class Base
    {
        public string Name;
    }

    class DeeperBase : Base
    {
    }

    class A : Base
    {
        public A()
        {
            Name = "A";
        }
    }

    class B : DeeperBase
    {
        public B()
        {
            Name = "B";
        }
    }

    static T Recast<T>(Base original) where T : Base, new()
    {
        if (!original.GetType().IsAssignableFrom(typeof(T)))
            throw new InvalidCastException();
        return new T();
    }

检查
T
original
是否共享最大的公共基类型(在本例中为
base
)的正确方法是什么

您正试图将实例
A
强制转换为
B
,但它不能,因为它们不是同一类型,
A
也不是从
B
派生的


无法将
A
转换为
B
。你可以做一个
重铸(a)
,但那没有意义。请注意,您实际上并没有以任何方式更改类型,您只是返回了
B
的一个新实例,或者抛出了一个异常。

您想在这里实现什么?@Anton Gogolev在
重铸
中,是否有办法检查
原始
T
是否共享一个基本类型?我觉得应该有办法,如果抛出异常,我们一定是做错了什么。在你的重铸方法上。(Base original)以这种方式声明为具体类型,因此它失败,因为您试图传递的是具体类“DeeperBase”,而不是Base类型。您还需要传入一个“泛型”。您的代码不是试图将a强制转换为基类型,而是试图将a强制转换为B,这显然是胡说八道。我猜您是在检查这两种类型是否都有公共父类型。在这种情况下,应该使用条件:if(!original.GetType().BaseType.IsAssignableFrom(typeof(T)))。但更好的方法是使用automapper(emit-mappet等)并将A映射到B,因为这样的转换没有意义。同样,正如@AntonGogolev所问的,我们不清楚您的目标是什么。我们的代码将所有对象存储在
Base
类型的字典中
Recast
不应返回
original
的强制转换,而是将词典中的
original
替换为
t
。我想我不太确定支票应该做什么,因为
T
original
总是共享
Base
。定义“铸造类型”。这里没有什么有用的东西。
    public static void Main(string[] args)
    {
        var a = new A();
        var b = Recast<B>(a); // exception
    }