【问题标题】:Member with the same signature is already declared已声明具有相同签名的成员
【发布时间】:2012-08-02 16:13:11
【问题描述】:

我知道这意味着什么,但想要优雅地解决这个问题。对于解决方案,我可以创建具有不同签名的方法,但这不会让我满意。 我的场景如下:

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) { ... }      
}

任何优雅的解决方案都会很棒

【问题讨论】:

  • @MarcGravell 是的,这是模棱两可的,如果 C# 允许,我可以将返回值转换为 ViewModelOne 和 ViewModelTwo 并且它可以执行适当的方法。我可以在 ISiteMapper 等中编写 MapToViewModelTwo 方法,但我想让我挑脑筋看看有没有办法解决这个问题

标签: c# .net asp.net-mvc-3


【解决方案1】:

这是因为 c# 不允许您仅根据返回类型重载方法 - 在确定两个方法是否具有相同的签名时只考虑方法参数。

唯一的解决方案是稍微调整您的 API 设计。

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

【讨论】:

  • 我怎样才能稍微调整我的 API 设计,这给了我优雅的解决方案。考虑到 Site 是主要的领域类,会有很多视图使用这个类来获取它的视图模型
【解决方案2】:

如果我理解您的设计,您的 SiteMapper 基本上是一个 工厂,让您的 SiteMapper 方法 MapDomainToView 返回给定站点的 ViewModel 列表,添加一个方法为特定站点注册 ViewModel,例如将此映射存储在字典中。

或使用 Castle Windsor 或您最喜欢的 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,如果你走这条路,请查看 Castle、Unity、NInject 等

【讨论】:

  • 谢谢,您的解决方案绝对值得研究,但在我目前的情况下,需要进行一些更改。正在重命名 MapToViewModelOne、MapToViewModelTwo 等方法。谢谢
【解决方案3】:

考虑到本质上您有一种方法可以仅基于一个给定参数来决定哪个(多/两个)视图模型返回最优雅的解决方案将只定义一个返回 ViewModel 超类的方法(确切地说在您的界面中定义)

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多