C# 在使用Moq模拟库时发现不明确匹配异常

C# 在使用Moq模拟库时发现不明确匹配异常,c#,inheritance,mocking,moq,ambiguous,C#,Inheritance,Mocking,Moq,Ambiguous,我正在使用,我意识到在这种情况下,我发现了不明确匹配异常,我需要帮助: 这是我的模型: public class User { } public class CustomUser { } 某些类别: public class BaseClass { public virtual User User { get; set; } } public class Father : BaseClass { public virtual new CustomUser User { ge

我正在使用,我意识到在这种情况下,我发现了
不明确匹配
异常,我需要帮助:

这是我的模型:

public class User
{
}

public class CustomUser
{
}
某些类别:

public class BaseClass
{
    public virtual User User { get; set; }
}

public class Father : BaseClass
{
    public virtual new CustomUser User { get; set; }
}

public class Child : Father
{
}
最后:

void Main()
{
    var user = new Mock<CustomUser>();
    var child = new Mock<Child>();
    child.SetupGet(x=>x.User).Returns (user.Object);  // Ambiguous match found.
}

任何帮助都将不胜感激。

为什么要更改或强制隐藏基类型,这就是这里的问题所在。如果您想定义一个单独的成员返回单独的类型,那么按照下面的方式执行,现在当您说
child.SetupGet(x=>x.User1).Returns(user.Object)时,您的mock不应该抱怨任何事情。您正在将属性的类型从
User
更改为
Customuser
,这两个实体之间没有相似性

public class Father : BaseClass
{
    public virtual CustomUser User1 { get; set; }
}

为了使mock工作,它需要
virtual
属性,在继承的情况下,该属性在基类中不存在(无歧义)

因此,您可以按照Rahul的建议重命名属性,或者将
基类更改为包含泛型属性:

public class BaseClass<TUser>
{
    public virtual TUser User { get; set; }
}

public class Father : BaseClass<CustomUser>
{
}

...
child.SetupGet(x=>x.User).Returns (user.Object);  // Works!
公共类基类
{
公共虚拟用户{get;set;}
}
公共阶级父亲:基本阶级
{
}
...
SetupGet(x=>x.User).Returns(User.Object);//作品

这些类显示了糟糕的设计,这让我相信这是一个错误。为什么父亲要更改基本属性?(请解释,以便我能更好地理解您的意图)。测试某物的困难通常表明原物有问题design@Nkosi更新后。应该没有必要模仿控制器。你到底想达到什么目的?您应该能够创建控制器的实例并设置用户。@Nkosi如果我有一个从请求或其他来源获取数据的
getter
属性,那么我会遇到更多问题。这就是为什么您应该向我们展示您实际在做什么,以便我们了解实际问题。
public class BaseClass<TUser>
{
    public virtual TUser User { get; set; }
}

public class Father : BaseClass<CustomUser>
{
}

...
child.SetupGet(x=>x.User).Returns (user.Object);  // Works!