簡體   English   中英

接口無法解析參數類型

[英]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()

嘗試

var service = new TreeService(rootDependency, fieldDependencies.Cast<INode>().ToList());

具有從類A派生的類B不能保證您將能夠將類型參數B的對象通用集合類型轉換為類型參數A的通用集合類型。

您可以在這里這里閱讀更多有關自變量的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM