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

我为我正在从事的项目做了一些大体相似的事情。从高层次的角度来看,如果你可以假设 Action Word 正是某个程序集中的一个方法的名称,那么你可以使用反射得到一个与实际函数对应的 MethodInfo。然后,您可以调用该函数,将适当的参数传递给该方法。

这里的一个问题是如何指定参数。由于参数的数量是可变的,因此您需要使用能够处理变量列表的数据结构。我建议使用字典来传递参数。

好的,假设您可以识别并加载适当的程序集,请继续执行以下操作:

foreach 动作:

  • 将 Word 属性的值检索到 actionWordString
  • 创建一个新的 Dictionary 实例
  • foreach 参数作用:
  • 检索 Name 和 Value 属性值
  • 在您的字典中添加一个新条目:即 dict[nameString] = valueString
  • 使用反射查找与 actionWordString 同名的 MethodInfo,它也将 Dictionary 作为参数
  • 调用方法,传入您之前创建和填充的字典。

描述的散文和实现的代码一样多。至少在我看来,最困难的事情之一是加载或访问包含方法的程序集的类型。此外,最好将方法实现为静态方法,这样您就不必担心创建处理程序类的实例。

于 2012-07-17T20:50:50.847 回答