通过将方法作为变量

时间:2015-06-09 10:04:53

标签: c# variables methods

我想将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 
        });

2 个答案:

答案 0 :(得分:4)

你要找的是代表:

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;
        }
    }
}

答案 1 :(得分:2)

使用Delegates,它是将Function作为参数传递给函数的最常用方法

我不知道什么类型,但您可以使用代表。这对一切都有效。如果您有更具体的功能,可以使用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
    }));