我正在尝试为单元测试目的创建一个Stub类。 Stub指向EXACT SAME EmployeeData
类定义,但编译器认为它们是不同的,不知何故。因此,我不断收到以下消息:
无法隐式转换类型 'MeasurementContracts.Business.Services.EmployeeData'来 'EmployeeData工作'
会导致什么?
类似于:
namespace MeasurementContracts.Business.Services
{
/// <summary>A data service model</summary>
public class EmployeeData
{
public int EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MiddleName { get; set; }
public string EmailAddress { get; set; }
public string KnownAs { get; set; }
public string Login { get; set; }
public string DomainName { get; set; }
public string EmployeeStatusName { get; set; }
public string WorkNumber { get; set; }
public string SystemPersonType { get; set; }
public string PersonType { get; set; }
public string CellPhoneNumber { get; set; }
public string OrganizationOrCostCenter { get; set; }
public string OrganizationalLevel1Description { get; set; }
public string PositionName { get; set; }
public int SupervisorId { get; set; }
public string GetName(bool useKnowAs = true)
{
if (useKnowAs && !string.IsNullOrWhiteSpace(this.KnownAs))
return $"{this.KnownAs} {this.LastName}";
return $"{this.FirstName} {this.LastName}";
}
}
}
STUB LOOKS LIKE:
namespace MeasurementContracts.UnitTests
{
using OData.Client;
using MeasurementContracts.Business.Services;
using System;
using System.Collections.Generic;
using System.Linq;
/// <summary>A proxy stub</summary>
public class ODataProxyStub : ODataProxy
{
#region <Constructors>
public ODataProxyStub()
{
Entities = new List<EmployeeData>();
}
#endregion
#region <Properties>
public List<EmployeeData> Entities { get; set; }
#endregion
#region <Properties>
public override EmployeeData GetItem<EmployeeData>(string query)
{
// This is NOT working?
return Entities.FirstOrDefault();
}
public override IEnumerable<EmployeeData> GetList<EmployeeData>(string query)
{
throw new NotImplementedException();
}
public override EmployeeData Post<EmployeeData>(string query, IEnumerable<object> parameters)
{
throw new NotImplementedException();
}
#endregion
}
}
PROXY BASE看起来像:
namespace OData.Client
{
public class ODataProxy
{
protected readonly HttpClient Client;
public ODataProxy();
public string BaseUrl { get; set; }
public virtual T GetItem<T>(string query);
public virtual IEnumerable<T> GetList<T>(string query);
public virtual T Post<T>(string query, IEnumerable<object> parameters);
}
}
答案 0 :(得分:4)
实际上它根本不是指同一个类。实际上,第二个EmployeeData
并未引用任何类。这是通用名称。
您的ODataProxy
定义了一种方法:
public virtual IEnumerable<T> GetList<T>(string query);
ODataProxyStub
实现的使用:
public override IEnumerable<EmployeeData> GetList<EmployeeData>(string query)
{strong>不这是EmployeeData
类型的专用版本(C#不支持),但您只需将T
重命名为EmployeeData
。< / p>
因此,编译器认为通用模板参数EmployeeData
无法转换为具体类EmployeeData
,这当然是正确的。
您可能想要的是:
class ODataProxy<T>
{
public virtual IEnumerable<T> GetList(string query)
{
}
}
class ODataProxyStub : ODataProxy<EmployeeData>
{
public override IEnumerable<EmployeeData> GetList(string query)
{
}
}
LINQpad重现问题的例子:
class Data
{
}
class Proxy
{
public virtual T Get<T>()
{
return default(T);
}
}
class Stub : Proxy
{
private Data x = default(Data);
public override Data Get<Data>()
{
return x;
}
}
无法将类型'UserQuery.Data'隐式转换为'数据'