.net 已声明具有相同签名的成员

ds97pgxw  于 2022-12-14  发布在  .NET
关注(0)|答案(4)|浏览(141)

我知道这意味着什么,但是我想要一个优雅的解决方案来解决这个问题。对于一个变通的解决方案,我可以创建具有不同签名的方法,但是这并不能满足我。我的场景如下:

public interface IDomainToViewMapper<TModel, TViewModel>
{
    TViewModel MapDomainToView(TModel source);
}

public interface ISiteMapper : IDomainToViewMapper<Site, ViewModelOne>,
                               IDomainToViewMapper<Site, ViewModelTwo>
{    }

现在当我写我的主实现类的时候,我得到了一个有同样签名问题的成员,我可以继续显式地实现接口,但是因为我们是动态地注入依赖项,我不能强制转换为接口,这又会是不明确的。

public SiteMapper : ISiteMapper
{
    public ViewModelOne MapDomainToView(Site site) { ... }
    public ViewModelTwo MapDomainToView(Site site) { ... }      
}

任何优雅的解决方案都是好的

m528fe3b

m528fe3b1#

这是因为C#不允许只根据返回类型重载方法--在确定两个方法是否具有相同的签名时,只考虑方法参数。
唯一的解决办法是稍微调整一下API设计。

EDIT:抱歉,当我重新阅读您的问题时,我意识到您已经知道错误的原因,并且正在寻找如何重新设计您的API。所以请忽略我的回答!

aamkag61

aamkag612#

你的SiteMapper基本上是一个工厂如果我理解你的设计,让你的SiteMapper方法MapDomainToView返回一个给定站点的ViewModel列表,添加一个方法,你可以在其中为特定站点注册ViewModel,将这个Map存储在一个字典中。
或者使用Castle温莎或您喜爱的IoC容器代替SiteMapper,或者可能在SiteMapper内部使用
示例:

public interface IViewModel
{
}

public class ViewModelOne : IViewModel
{
}

public class ViewModelTwo : IViewModel
{
}

public class SiteMapper 
{
    private Dictionary<Site, List<IViewModel>> map { get; set; }

    public void Register(Site site, IViewModel viewModel)
    {
        // Add combination to map
    }

    public List<IViewModel> MapDomainToViews(Site site) 
    {
        if (map.ContainsKey(site))
            return map[site];
        else
            ....
    }
}

这是一个简单的IoC,如果你走这条路,检查城堡,统一,NInject等

oknwwptz

oknwwptz3#

考虑到您实际上有一个方法可以仅基于一个给定参数来决定返回哪个(多个/两个)视图模型,最佳解决方案将是仅定义一个返回ViewModel超类的方法(与接口中的定义完全相同)

tsm1rwdh

tsm1rwdh4#

我想知道你是否把Library和Shelf作为类而不是记录结构类型,从而引入了不必要的复杂性。

public record struct Shelf(int Id, string Name, int Cost, int Price, List<Book> Books);

以及

public record struct Library(int Id, string Name, int Cost, int Price, List<Shelf> Shelves);

除了减少样板文件之外,我希望这将允许编译器比手工编译获得更好的性能。

相关问题