通过将方法作为变量发送来简化代码
本文关键字:代码 变量 方法 | 更新日期: 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
}));