我有一个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>
对于每个 Action Word ,我有一个方法。如何读取此xml并使用参数动态执行方法。 参数名称是我方法中的实际变量。每次参数的数量都不同。确切地说,我想读取xml并获取动作词列表,然后使用值执行它们。 感谢您的帮助。
-Sasi
答案 0 :(得分: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"]));
}
答案 1 :(得分:1)
我为我正在进行的项目做了大致相似的事情。从高级角度来看,如果您可以假设Action Word正好是某个程序集中方法的名称,那么您可以使用反射来获取与实际函数对应的MethodInfo。然后,您可以调用该函数,将适当的参数传递给方法。
这里的一个问题是如何指定参数。由于将有可变数量的参数,您需要使用能够处理变量列表的数据结构。我建议使用Dictionary来传递参数。
好的,假设您可以识别并加载适当的程序集,请执行以下操作:
foreach行动:
需要尽可能多的散文来描述它实现的代码。至少在我发现它时,更难的事情之一是加载或访问包含方法的程序集类型。此外,最好将方法实现为static,这样您就不必担心创建处理程序类的实例。