1

私は以下のようなxmlを持っています:

<?xml version="1.0" encoding="ISO-8859-1"?>
<TestCase Name="1.7 Bus01">
 <Action Word="Login" Text="Login" TestCaseId="MPD_QS_06">
    <Parameter Name="userName" Value="user1"/>
    <Parameter Name="userPwd" Value="user1"/>
    <Parameter Name="Tenant" Value="tnt1"/>
    <Parameter Name="expectedResult" Value="Login success"/>
 </Action>
 <Action Word="AddOrganisation" Text="AddOrganisation">
    <Parameter Name="name" Value="MAHNEWX"/>
    <Parameter Name="senderId" Value=""/>
    <Parameter Name="address" Value="77 Westferry Circus"/>
    <Parameter Name="postCode" Value="E77 4 HB"/>
    <Parameter Name="city" Value="London"/>
    <Parameter Name="country" Value="United Kingdom"/>
    <Parameter Name="state" Value=""/>
    <Parameter Name="email" Value=""/>
    <Parameter Name="telCountryCode" Value=""/>
    <Parameter Name="telNumber" Value=""/>
    <Parameter Name="telExtension" Value=""/>
    <Parameter Name="faxCountryCode" Value=""/>
    <Parameter Name="faxNumber" Value=""/>
    <Parameter Name="faxExtension" Value=""/>
    <Parameter Name="roleList" Value="MAH"/>
    <Parameter Name="expectedResult" Value="Organisation is added"/>
  </Action>
  <Action Word="NewValidationRegistration" Text="NewValidationRegistration">
    <Parameter Name="registrationname" Value="FusionUnion"/>
    <Parameter Name="AS2Identifier" Value="MPTVC"/>
    <Parameter Name="expectedResult" Value="Registration is validated"/>
  </Action>
  <Action Word="NewSubmissionRegistration" Text="NewSubmissionRegistration">
     <Parameter Name="registrationname" Value="FusionUnion"/>
     <Parameter Name="AS2Identifier" Value="MPTVC"/>
     <Parameter Name="expectedResult" Value="Registration is submitted"/>
  </Action>
  <Action Word="Logout" Text="Logout">
     <Parameter Name="expectedResult" Value="Logout success"/>
  </Action>
</TestCase> 

アクションワードごとにメソッドがあります。この xml を読み取り、パラメーターを使用してメソッドを動的に実行するにはどうすればよいですか。Parameter Nameは、メソッド内の実際の変数です。パラメータの数は毎回異なります。正確には、xml を読み取り、アクション ワードのリストを取得し、値を使用してそれらを実行したいと考えています。事前に助けてくれてありがとう。

-サシ

4

2 に答える 2

3
object obj = this; //your object containing methods
XDocument xDoc = XDocument.Parse(xml);
Type type = obj.GetType(); 

foreach (var action in xDoc.Descendants("Action"))
{
    MethodInfo mi = type.GetMethod(action.Attribute("Word").Value);

    var dict =  action.Descendants().ToDictionary(
                                         d=>d.Attribute("Name").Value,
                                         d=>d.Attribute("Value").Value);

    object[] parameters = mi.GetParameters()
        .Select(p => Convert.ChangeType(dict[p.Name],p.ParameterType))
        .ToArray();

    var expectedResult = mi.Invoke(obj, parameters);

    Debug.Assert(expectedResult.Equals(dict["expectedResult"]));
}
于 2012-07-17T20:50:03.553 に答える
1

私が取り組んでいるプロジェクトについて、ほぼ同様のことをしました。高レベルの観点から、アクションワードがアセンブリ内のメソッドの名前であると正確に想定できる場合は、リフレクションを使用して、実際の関数に対応するMethodInfoを取得できます。次に、関数を呼び出して、適切なパラメーターをメソッドに渡します。

ここでの1つのキャッチは、パラメーターを指定する方法です。パラメータの数は可変であるため、変数リストを処理できるデータ構造を使用する必要があります。辞書を使用してパラメーターを渡すことをお勧めします。

さて、適切なアセンブリを識別してロードできると仮定して、次のように進めます。

foreachアクション:

  • Word属性の値をactionWordStringに取得します
  • 新しいDictionaryインスタンスを作成します
  • 動作中のforeachパラメーター:
  • 名前と値の属性値を取得する
  • 辞書に新しいエントリを追加します。つまり、dict [nameString] = valueString
  • リフレクションを使用して、actionWordStringと同じ名前で、パラメーターとして辞書も使用するMethodInfoを検索します。
  • メソッドを呼び出し、以前に作成して入力したディクショナリを渡します。

実装するコードと同じくらい多くの散文を記述します。少なくとも私が思うに、難しいことの1つは、メソッドを含むアセンブリのタイプをロードまたはアクセスすることです。また、ハンドラークラスのインスタンスの作成について心配する必要がないように、メソッドを静的として実装するのがおそらく最善でしょう。

于 2012-07-17T20:50:50.847 に答える