C# 将类型转换为具有相同声明的不同类型
C# Cast a type to a different type with same declaration
所以假设我有一个类型 X
,它是一个抽象 class,就像 public abstract class X
一样。现在假设我有一个类型 A
,它派生自类型 Y
,就像这样 public class A : Y
。 X
和Y
的定义相同:
public abstract class X
{
public string Name { get; internal set; }
public virtual void PrintName()
{
Console.WriteLine(Name);
}
}
public abstract class Y
{
public string Name { get; internal set; }
public virtual void PrintName()
{
Console.WriteLine(Name);
}
}
我无法更改 X
中的任何内容(添加界面,...)。我也不能从 X
派生,因为程序会自动加载它。 classes X
和 Y
更大,有字段、属性和大量方法,但我尽可能保持最小。是否可以将 A
转换为 X
?像
X obj = (X)(new A())
我已经尝试过:Json De/Seriliazation,使用动态 X cls = (X)(new A() as dynamic);
。我可能会使用 TypeBuilder,但我没有任何使用 TypeBuilder 的经验。
我认为您可以使用 AutoMapper 解决此问题:
https://docs.automapper.org/en/stable/Mapping-inheritance.html
将AutoMapper nuget包添加到您的项目后,添加以下内容class:
public class XYBAProfile : AutoMapper.Profile
{
public XYBAProfile()
{
CreateMap<Y, X>()
.Include<A, B>();
CreateMap<A, B>();
}
}
现在您应该能够从任何 A 对象创建 X 对象了:
public static void Test()
{
var mapperConfig = new AutoMapper.MapperConfiguration(conf => conf.AddProfile<XYBAProfile>());
var mapper = mapperConfig.CreateMapper();
var a = new A() { Name = "Something" };
X x = mapper.Map<X>(a);
x.PrintName();
}
所以假设我有一个类型 X
,它是一个抽象 class,就像 public abstract class X
一样。现在假设我有一个类型 A
,它派生自类型 Y
,就像这样 public class A : Y
。 X
和Y
的定义相同:
public abstract class X
{
public string Name { get; internal set; }
public virtual void PrintName()
{
Console.WriteLine(Name);
}
}
public abstract class Y
{
public string Name { get; internal set; }
public virtual void PrintName()
{
Console.WriteLine(Name);
}
}
我无法更改 X
中的任何内容(添加界面,...)。我也不能从 X
派生,因为程序会自动加载它。 classes X
和 Y
更大,有字段、属性和大量方法,但我尽可能保持最小。是否可以将 A
转换为 X
?像
X obj = (X)(new A())
我已经尝试过:Json De/Seriliazation,使用动态 X cls = (X)(new A() as dynamic);
。我可能会使用 TypeBuilder,但我没有任何使用 TypeBuilder 的经验。
我认为您可以使用 AutoMapper 解决此问题: https://docs.automapper.org/en/stable/Mapping-inheritance.html
将AutoMapper nuget包添加到您的项目后,添加以下内容class:
public class XYBAProfile : AutoMapper.Profile
{
public XYBAProfile()
{
CreateMap<Y, X>()
.Include<A, B>();
CreateMap<A, B>();
}
}
现在您应该能够从任何 A 对象创建 X 对象了:
public static void Test()
{
var mapperConfig = new AutoMapper.MapperConfiguration(conf => conf.AddProfile<XYBAProfile>());
var mapper = mapperConfig.CreateMapper();
var a = new A() { Name = "Something" };
X x = mapper.Map<X>(a);
x.PrintName();
}