我正在调用API并希望动态调用该对象的方法。使用ASP.Net反射,它似乎允许您获取该对象的类型,然后调用。但这似乎从该类的空实例调用该方法。在我的情况下,我在该类的现有实例中具有该数据/信息的对象,因此可以从中动态调用方法吗?
例如:
我有ServiceReference“ThirdPartyRef”。
ThirdPartyRef.ThirdPartyRefApiClient api = new ThirdPartyRef.ThirdPartyRefApiClient();
ThirdPartyRef.ApiObjectCollection collection = new ThirdPartyRef.ApiObjectCollection();
ThirdPartyRef.GetOrderUpdatesCollections orderUpdates = new ThirdPartyRef.GetOrderUpdatesCollections();
collection = (ThirdPartyRef.ApiObjectCollection)api.get(orderUpdates);
foreach (ThirdPartyRef.Order orderUpdate in collection.Items)
{
MethodInfo[] mi = orderUpdate.GetType().GetMethods();
foreach (MethodInfo orderUpdateMethInfo in mi)
{
string methodName = orderUpdateMethInfo.Name.Replace("get_", ""); // for example get_LastModifiedDate and set_LastModifiedDate is available
var meth = orderUpdate.GetType().GetMethod(methodName);
string result = string.Empty;
result = meth.Invoke(orderUpdateMethInfo, null).ToString();
Console.WriteLine("result: " + result.ToString());
}
}
我为此示例更改了第三方公司的实际名称,希望通过重新输入代码我没有犯错误。
当我运行上面的代码时,我只得到空输出。所以这让我相信具有“meth.Invoke”的行正在对象的空实例或“类型”上执行,而不是在具有数据的实际实例上执行。
当我直接在该对象上调用该方法时,我能够看到数据。
Console.WriteLine("LastModified:" + orderUpdate.LastModified.ToString());
输出 - LastModified:8/3/2015 5:43:18 PM
有没有办法在现有对象上动态调用方法?或者我是否会以错误的方式解决这个问题?我想动态地这样做的原因是因为有40多种方法我想把它放到数据库中。如果我可以将数据库表布局为匹配,那么从长远来看如果第三方公司要更改其API会更容易。
答案 0 :(得分:3)
更改此行:
result = meth.Invoke(orderUpdateMethInfo, null).ToString();
到此:
result = meth.Invoke(orderUpdate, null).ToString();
Invoke的第一个参数是您正在操作的对象,该对象应该是您在静态代码示例中显示的orderUpdate
对象,您可以直接调用LastModified
。< / p>