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
}