通过将方法作为变量发送来简化代码

本文关键字:代码 变量 方法 | 更新日期: 2023-09-27 17:54:26

我想把XML加载到我的程序中。

大部分代码都是一样的,只有一点区别。

这部分在许多方法中使用。但有一点不同。

        while (reader.Read())
        {
            if (StateElement(State.Enter, "EnterElement", reader))// "EnterElement" is Variable
            {
                LoadElement(reader, type);// Method LoadElement and type are variables
            }
            else if (StateElement(State.Exit, "ExitElement", reader))//"ExitElement" is Variable
            {
                break;
            }
        }

如果我能把这部分放在Method中,它将节省很多行,变得非常简化和可读。

我希望我也能有这样的方法。

    private void ReadElement(XmlTextReader reader,string enterElement,string exitElement,LoadElement(reader, type))
    {
        while (reader.Read())
        {
            if (StateElement(State.Enter, enterElement, reader))
            {
                LoadElement(reader, baseType);
            }
            else if (StateElement(State.Exit, exitElement, reader))
            {
                break;
            }
        }
    }

然后调用它:

ReadElement(reader,"EnterElement","ExitElement",LoadElement(reader,type));

这可能吗?(这种方式是不可能的,但有没有办法发送方法作为变量?)

解决:

谢谢你的回答。这是我的方法与委托。

    private void ReadElement(XmlTextReader reader, string enterElement, string exitElement, object type, Delegate loadElement)
    {
        while (reader.Read())
        {
            if (StateElement(State.Enter, enterElement, reader))
            {
                loadElement.DynamicInvoke(type);
            }
            else if (StateElement(State.Exit, exitElement, reader))
            {
                return;
            }
        }
    }

和它的命名方式:

        ReadElement(reader, "enterElement", "exitElement", baseType, (Action<BaseType>)(type => // or (Action)(() => for no arguments.
        {
            LoadElement(reader, type);
        }));

LoadElement现在可以为空

因为我调用了每个方法,所以我直接将方法和变量传递给委托,所以它会更简单。

private void ReadElement(XmlTextReader reader, string enterElement, string exitElement, Action loadElement)

,而不是DynamicInvoke,我使用Invoke巫婆更快。

调用也可以是:

        ReadElement(reader, "EnterElement", "ExitElement", () =>
        {
            LoadElement(reader, baseType);//basetype and reader will be passed to delegate by the current method that is calling ReadElement 
        });

通过将方法作为变量发送来简化代码

你要找的是委托:

https://msdn.microsoft.com/en-us/library/ms173171.aspx

简而言之,委托作为另一个方法或函数的占位符起作用。调用委托占位符将委托调用委托所指向的任何对象。这是一个过分简化的地方,这是一个真正需要进一步阅读的领域。

在您的特定情况下,您可以使用Action委托。你可以像调用方法一样调用委托,你的新方法看起来像这样:

private void ReadElement(XmlTextReader reader,string enterElement,string exitElement,Action<XmlTextReader, Type> action)
{
    while (reader.Read())
    {
        if (StateElement(State.Enter, enterElement, reader))
        {
            action(yourReader, yourType);
        }
        else if (StateElement(State.Exit, exitElement, reader))
        {
            break;
        }
    }
}

使用委托是将函数作为参数传递给函数的最常用方法

我不知道是什么类型,但你可以使用委托。这对任何事情都适用。如果你有更具体的功能你可以使用Action<...>Func<...>或特定的delegate

piravte void ReadElement(XmlTextReader reader,string enterElement,string exitElement, Delegate LoadElement, object yourReader, object yourType))
{
    while (reader.Read())
        {
            if (StateElement(State.Enter, enterElement, reader))
            {
                LoadElement.DynamicInvoke(yourReader, yourType);
            }
            else if (StateElement(State.Exit, exitElement, reader))
            {
                break;
            }
        }
}

调用ReadElement:

ReadElement(yourReader, yourEnterElement, yourExitelement, (Action<string, dataTypeOfType>)((yourReader, yourType) => 
    { 
        // Whatever you want to do in LoadElement 
        // Use yourReader and yourType as the Parameter of your Function
    }));