C# 调用扩展方法(TreeNodeCollection Add方法)的正确方法是什么?

C# 调用扩展方法(TreeNodeCollection Add方法)的正确方法是什么?,c#,winforms,extension-methods,treenodecollection,C#,Winforms,Extension Methods,Treenodecollection,下面是我代码的相关部分。在MyTreeView类(下面的最后一块代码)中,代码TncExtensions.tncnodead行(这是myTreeViewNode)生成错误CS7036给定的参数没有对应于“TncExtensions.tncnodead(TreeNodeCollection,MyTreeView_Abstract,MyTreeView_Abstract)”的必需形式参数“myTreeViewNode” 为什么编译器不能找出我的TreeNodeCollection扩展方法的第二个形式

下面是我代码的相关部分。在
MyTreeView
类(下面的最后一块代码)中,代码
TncExtensions.tncnodead行(这是myTreeViewNode)
生成错误
CS7036给定的参数没有对应于“TncExtensions.tncnodead(TreeNodeCollection,MyTreeView_Abstract,MyTreeView_Abstract)”的必需形式参数“myTreeViewNode”

为什么编译器不能找出我的TreeNodeCollection扩展方法的第二个形式参数是什么

公共静态类TncExtensions
{
公共静态int tncnodead(此TreeNodeCollection节点,MyTreeView_Abstract MyTreeView,MyTreeView节点_AbstractMyTreeView节点)
{
返回myTreeView.Nodes.Add(myTreeViewNode);
}
}
公共抽象类MyTreeViewNode_抽象:TreeNode
{
公共MyTreeViewNode_摘要(字符串文本):基(文本)
{
}
}
公共类MyTreeViewNode:MyTreeViewNode_抽象
{
公共MyTreeViewNode(字符串文本):基(文本)
{
}
}
公共抽象类MyTreeView_抽象:TreeView
{
}
公共类MyTreeView:MyTreeView_摘要
{
公共void CreateTree()
{
MyTreeViewNode MyTreeViewNode=新的MyTreeViewNode(“节点文本”);
TncExtensions.tncnodead(这是myTreeViewNode);
}
}

我相信您创建的扩展方法没有多大用处,但是如果您想知道问题出在哪里,那么您使用的扩展方法是错误的。您像静态方法一样访问它,在这种风格中,您需要根据方法的签名传递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);
}

要了解更多信息,请查看。

我相信您创建的扩展方法没有多大用处,但是如果您想知道问题所在,那么您使用的扩展方法是错误的。您像静态方法一样访问它,在这种风格中,您需要根据方法的签名传递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);
}

要了解更多信息,请查看。

Reza'a答案仍然是答案,但为了使我的treenode
Add
扩展方法有用,我必须修改对它的调用。我忘记了,作为添加treenode的一部分,您需要指定要将新节点附加到的节点集合

注:有关涉及的基本类,请参见原始问题中的代码

根据Reza的建议修改了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.

    }
}

Reza'a答案仍然是答案,但是为了使我的treenode
Add
扩展方法有用,我不得不修改对它的调用。我忘记了,作为添加treenode的一部分,您需要指定要将新节点附加到的节点集合

注:有关涉及的基本类,请参见原始问题中的代码

根据Reza的建议修改了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.

    }
}

您声明了一个扩展方法,但它的使用方式与普通静态方法相同。如果您像调用普通静态方法一样调用它,则需要提供所有参数(在您的案例3中,而不仅仅是2)。也就是说,试图像普通静态方法那样调用扩展方法似乎有点错误。也许可以查阅有关扩展方法的教程,以澄清它们通常是如何使用/调用的。您使用的扩展方法是错误的。另外,扩展方法中的
节点
参数的确切用途是什么?您的扩展方法没有使用
节点
,那么将它放在那里有什么意义呢?@HansPassant:我不同意。最初,我使用base
TreeNodeCollection Add
方法将自定义
TreeView
节点添加到自定义
TreeView
。在我的自定义
TreeView
中,我拥有跟踪自定义
TreeView
状态的自定义属性。在没有将钩子引入
Add
方法的情况下,我必须在每次调用基本
Add
方法之后立即使用内联代码更新自定义属性。通过使用
Add
扩展方法和将自定义节点绑定到自定义
TreeView
的自定义属性,我可以在一个中心位置更新自定义
TreeView
属性。您声明了扩展方法,但像普通静态方法一样使用了它。如果您像调用普通静态方法一样调用它,则需要提供所有参数(在您的案例3中,而不仅仅是2)。也就是说,试图像普通静态方法那样调用扩展方法似乎有点错误。也许可以查阅有关扩展方法的教程,以澄清它们通常是如何使用/调用的。您使用的扩展方法是错误的。另外,扩展方法中的
节点
参数的确切用途是什么?您的扩展方法没有使用
节点
,那么将它放在那里有什么意义呢?@HansPassant:我不同意。最初,我使用base
TreeNodeCollection Add
方法将自定义
TreeView
节点添加到自定义
TreeView
。在我的自定义
TreeView
中,我拥有跟踪自定义
TreeView
状态的自定义属性。在没有将钩子引入
Add
方法的情况下,我必须在每次调用基本
Add
方法之后立即使用内联代码更新自定义属性。通过使用
Add
扩展方法和将自定义节点绑定到自定义
TreeView
的自定义属性,我可以在一个中心位置更新自定义
TreeView
属性。感谢您提供有关如何正确使用扩展方法的指导。我(显然)没有明白。扩展方法看起来不太像,因为我只提供了询问m所需的最小代码