gpt4 book ai didi

c# - AutoMapper:将接口(interface)映射到抽象类——这可能吗?

转载 作者:太空狗 更新时间:2023-10-29 22:54:59 25 4
gpt4 key购买 nike

我正在使用 AutoMapper在我的应用程序的不同层之间映射对象。一方面,我有一个如下所示的界面:

public interface MyRepo 
{
IEnumerable<IRootObject> GetItems(param);
}

IRootObject 看起来像这样:

public interface IRootObject
{
int Id { get; set; }
DateTime? Date { get; set; }
}

public interface IFirstSubObject : IRootObject
{
string MyFirstProp { get; set; }
}

public interface ISecondSubObject : IRootObject
{
string MySecondProp { get; set; }
}

所以 GetItems() 调用实际上返回一个仅包含 IxxxSubObjectItems 的数组。另一方面,结构如下所示:

public abstract class MyCustomRoot
{
protected MyCustomRoot(){}
public int Id { get; set; }
public DateTime? Date { get; set; }
}

public class MyCustomFirstSub : MyCustomRoot
{
public MyCustomFirstSub() : base() {}
public string MyFirstProp { get; set; }
}

public class MyCustomSecondSub : MyCustomRoot
{
public MyCustomSecondSub () : base() {}
public string MySecondProp { get; set; }
}

现在我已经像这样设置了映射器

AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot>
.Include<IFirstSubObject, MyCustomFirstSub>
.Include<ISecondSubObject, MyCustomSecondSub>();

AutoMapper.Mapper.CreateMap<IFirstSubObject, MyCustomFirstSub>();
AutoMapper.Mapper.CreateMap<ISecondSubObject, MyCustomSecondSub>();

但我不断收到 MapperExceptions(“无法构造抽象类”,这在某种程度上是有道理的)。我还调用了 AssertConfigurationIsValid,它通过了此代码。
如果我不将 MyCustomRoot 类抽象化,那么映射就可以工作,但我得到了一个 MyCustomRoot 对象的列表,而我实际上想要一个 MyCustomxxxSub,因为后面有一个 Factory 使用这个类型来生成正确的 UI...

我希望有人能为我指出正确的方向!
谢谢!

最佳答案

好的,我找到了一个真正做到这一点的方法!所以使用上面提供的接口(interface)和类,你可以做这样的事情
(记住:MyCustomRoot 类是抽象类)

AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot>
.Include<IFirstSubObject, MyCustomFirstSub>
.Include<ISecondSubObject, MyCustomSecondSub>();

然后使用以下 Map 调用来映射对象:

public List<MyCustomRoot> PerformMapping(List<IRootObject> rootObjects)
{
var returnList = new List<CustomRoot>();
foreach(var rootObject in rootObjects)
{
var abstractObject = (MyCustomRoot)Mapper.Map(rootObject, rootObject.GetType(), typeof(MyCustomRoot));
returnList.Add(abstractObject);
}
return returnList;
}

现在我实际上得到了一个MyCustomRoot对象的数组,这些都是具体的实现。

这正是我要找的!

关于c# - AutoMapper:将接口(interface)映射到抽象类——这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5578253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com