gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:22:44 26 4
gpt4 key购买 nike

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

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

已解决:

感谢您的回答。这是我的委托(delegate)方法。

    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 现在可以为 void。

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

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

我使用 Invoke 而不是 DynamicInvoke 更快。

调用也将是:

        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

简而言之,委托(delegate)充当另一个方法或函数的占位符。调用委托(delegate)占位符委托(delegate)调用委托(delegate)指向的任何内容。这是一个严重的过度简化,这是一个真正需要进一步阅读的领域。

在您的特定情况下,您可以使用 Action 委托(delegate)。您可以像调用方法一样调用委托(delegate),您的新方法将如下所示:

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

关于c# - 通过将方法作为变量发送来简化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30728983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com