[英]Interface not resolving for parameter type
我有以下課程:
namespace CommonInterfaces
{
public interface INode
{
int? ParentNodeId { get; set; }
int? ChildNodeId { get; set; }
}
}
public class FieldDependencyModel : DataModel<int>, ICacheable
{
#region Field
private int _FieldDependencyId;
private int? _FieldId;
private int? _FieldParentId;
#endregion
#region Properties
public virtual int FieldDependencyId
{
get { return getPropertyValue("FieldDependencyId",_FieldDependencyId); }
set { _FieldDependencyId = value; }
}
public virtual int? ChildNodeId
{
get { return getPropertyValue("FieldId",_FieldId); }
set { _FieldId = value; }
}
public virtual int? ParentNodeId
{
get { return getPropertyValue("FieldParentId",_FieldParentId); }
set { _FieldParentId = value; }
}
#endregion
}
public interface IFieldDependencyService
{
IList<FieldDependency> GetAllFieldDependencies();
}
public class FieldDependency : FieldDependencyModel, INode
{
}
public class FieldDependencyDataService : BaseDataService, IFieldDependencyService
{
public FieldDependencyDataService(DataAccessHandle serviceHandler) : base(serviceHandler) {}
public IList<FieldDependency> GetAllFieldDependencies()
{
return _accessService.loadAll<FieldDependency>();
}
}
public class TreeService
{
private IList<INode> _relationships;
private INode _rootNode;
public TreeService(INode rootNode, IList<INode> nodeRelationships)
{
_relationships = nodeRelationships;
_rootNode = rootNode;
}
public Tree<INode> BuildTree()
{
Tree<INode> tree;
tree = new Tree<INode>(_rootNode, _relationships);
return tree;
}
}
我嘗試發送一種隱含INode的類型,當我嘗試將fieldDependencies傳遞給新的TreeService實例時,它仍然顯示以下錯誤:
Error 5 Argument 2: cannot convert from 'System.Collections.Generic.IList<FieldDependency>' to 'System.Collections.Generic.IList<CommonInterfaces.INode>'
這是我收到此錯誤的調用代碼:
IList<FieldDependency> fieldDependencies = _service.GetAllFieldDependencies();
FieldDependency rootDependency = fieldDependencies.First(d => d.ParentNodeId == null);
var service = new TreeService(rootDependency, fieldDependencies); // fails here, doesn't like fieldDependencies
嘗試這個
IList<INode> fieldDependencies = _service.GetAllFieldDependencies()
.First(d => d.ParentNodeId == null).Select(d => (INode)d);
您無法執行此操作,因為您試圖將IList<FieldDependency>
轉換為IList<INode>
,因此您要轉換的實際對象是具有相關類型作為其通用類型的IList
。 您可以采取一些行動來解決此問題。
IList<FieldDependency>
替換為IList<INode>
您可以更改代碼,使IList<FieldDependency>
是IList<INode>
。
public interface IDataFieldDependencyService
{
IList<INode> GetAllFieldDependencies();
}
public class FieldDependencyDataService : BaseDataService, IFieldDependencyService
{
public FieldDependencyDataService(DataAccessHandle serviceHandler) : base(serviceHandler) {}
public IList<INode> GetAllFieldDependencies()
{
return _accessService.loadAll<FieldDependency>();
}
}
用法
IList<INode> fieldDependencies = _service.GetAllFieldDependencies();
INode rootDependency = fieldDependencies.First(d => d.ParentNodeId == null);
var service = new TreeService(rootDependency, fieldDependencies);
Select
並轉換為INode
您還可以從_service.GetAllFieldDependencies()
中選擇所有元素,然后將其放在INode
。
IList<INode> fieldDependencies = _service.GetAllFieldDependencies()
.Select(e => (INode)e)
.ToList();
INode rootDependency = fieldDependencies.First(d => d.ParentNodeId == null);
var service = new TreeService(rootDependency, fieldDependencies);
如果使用IEnumerable
s,則可能可以使用協方差 (我相信.NET 4)來做您想做的事情。
public class TreeService
{
private IEnumerable<INode> _relationships;
private INode _rootNode;
public TreeService(INode rootNode, IEnumerable<INode> nodeRelationships)
{
_relationships = nodeRelationships;
_rootNode = rootNode;
}
public Tree<INode> BuildTree()
{
Tree<INode> tree;
tree = new Tree<INode>(_rootNode, _relationships);
return tree;
}
}
用法
IEnumerable<INode> fieldDependencies = _service.GetAllFieldDependencies();
INode rootDependency = fieldDependencies.First(d => d.ParentNodeId == null);
var service = new TreeService(rootDependency, fieldDependencies);
您已經將字段依賴項定義為FieldDependency的列表,即
fieldDependencies.GetType() == typeof<IList<FieldDependency>>
TreeService構造函數的第二個參數期望tyepof(IList<INode>>)
您應該能夠更改將變量fieldDependencies定義為IList<INode>
即
IList<INode> fieldDependencies = _service.GetAllFieldDependencies()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.