2015-06-09 67 views
2

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

如果我能夠把這部分內部方法,它會節省大量的線條,變得非常簡單和可讀。

我希望我能有這樣的方法。

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

使用委託它最常見的方式來傳遞一個函數作爲參數傳遞給函數

我不噸知道什麼類型,但你可以使用委託。這將適用於一切。如果你有一個更具體的功能,你可以使用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 
    })); 
+0

IM我想你的解決方案,以瞭解和我能夠使我的方法恢復正常'無效'。所以我將你的解決方案標記爲答案。因爲我認爲它效果更好。你可以在我的代碼中看到我所做的更改。任何方式。謝謝你們倆。 :) @richzilla –

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

如何使用內部ReadElement行動? –

+0

編輯顯示用法 – richzilla

+1

非常感謝。有用。代表真棒! –