Как правильно вызвать метод расширения (метод Add TreeNodeCollection)? - PullRequest
0 голосов
/ 30 июня 2018

Соответствующие части моего кода приведены ниже. В классе MyTreeView (последний блок кода ниже) строка кода TncExtensions.TncNodeAdd(this, myTreeViewNode); генерирует ошибку CS7036 There is no argument given that corresponds to the required formal parameter 'myTreeViewNode' of 'TncExtensions.TncNodeAdd(TreeNodeCollection, MyTreeView_Abstract, MyTreeViewNode_Abstract)'

Почему компилятор не может определить, что является вторым формальным параметром для моего метода расширения TreeNodeCollection?

public static class TncExtensions
{
    public static int TncNodeAdd(this TreeNodeCollection nodes, MyTreeView_Abstract myTreeView, MyTreeViewNode_Abstract myTreeViewNode)
    {
        return myTreeView.Nodes.Add(myTreeViewNode);
    }
}

public abstract class MyTreeViewNode_Abstract : TreeNode
{
    public MyTreeViewNode_Abstract(string text) : base(text)
    {
    }
}

public class MyTreeViewNode : MyTreeViewNode_Abstract
{
    public MyTreeViewNode(string text) : base(text)
    {
    }
}

public abstract class MyTreeView_Abstract : TreeView
{
}

public class MyTreeView : MyTreeView_Abstract
{
    public void CreateTree()
    {
        MyTreeViewNode myTreeViewNode = new MyTreeViewNode("node text");
        TncExtensions.TncNodeAdd(this, myTreeViewNode);
    }
}

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Reza'a ответ по-прежнему является ответом, но, чтобы сделать мой метод расширения treenode Add полезным, мне пришлось изменить его вызовы. Я забыл, что для добавления триода необходимо указать, к какому семейству узлов вы хотите добавить новый узел.

Примечание: см. Код в оригинальном вопросе об основных участвующих классах

Модифицировано Добавить метод расширения, предложенный Резой

namespace TreeNodeCollectionExtensions
{
    public static class TncExtensions
    {
        public static int Add(this TreeNodeCollection nodes, DRT.DRT_TvwNode_Abstract myTreeViewNode)
        {
            int newNodeIndex = nodes.Add(myTreeViewNode);

            //Do stuff to custom properties that are members of DRT_TvwNode_Abstract and classes derived from DRT_TvwNode_Abstract

            return newNodeIndex;
        }
    }
}

Используйте это так

using TreeNodeCollectionExtensions;

public class MyTreeView : MyTreeView_Abstract
{
    public MyTreeView() : base()
    {
    }

    public void CreateTree()
    {
        MyTreeViewNode myTreeViewNode;

        //Add node to root of TreeView 
        //Using named parameter to force the compiler to
        //use the Add extension method and not the base Add method
        myTreeViewNode = new MyTreeViewNode("root node text");
        Nodes.Add(myTreeViewNode: myTreeViewNode);

        //Add node one level below root node of TreeView
        //Using named parameter to force the compiler to
        //use the Add extension method and not the base Add method
        myTreeViewNode = new MyTreeViewNode("level 1 node text");
        int newLevel1NodeIndex = Nodes[0].Nodes.Add(myTreeViewNode: myTreeViewNode);

        //Add node one level below level 1 node just created 
        //Using named parameter to force the compiler to
        //use the Add extension method and not the base Add method
        myTreeViewNode = new MyTreeViewNode("level 2 node text");
        int newLevel2NodeIndex = Nodes[0].Nodes[newLevel1NodeIndex].Nodes.Add(myTreeViewNode: myTreeViewNode);

        //etc., etc.

    }
}
0 голосов
/ 30 июня 2018

Я считаю, что метод расширения, который вы создали, не очень полезен, но если вам интересно узнать, в чем проблема, вы неправильно используете метод расширения. Вы обращаетесь к нему как статический метод, в этом стиле вам нужно передать 3 аргумента на основе сигнатуры метода:

TncExtensions.TncNodeAdd(Nodes, this, myTreeViewNode);

Или используйте его как метод расширения:

this.Nodes.TncNodeAdd(this, myTreeViewNode);

Я предлагаю вам изменить метод расширения на:

public static int TncNodeAdd(this TreeNodeCollection nodes, MyTreeViewNode_Abstract myTreeViewNode)
{
    return nodes.Add(myTreeViewNode);
}
...