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