c#如何在现有对象

时间:2015-08-05 17:35:26

标签: c# asp.net

我正在调用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会更容易。

1 个答案:

答案 0 :(得分:3)

更改此行:

result = meth.Invoke(orderUpdateMethInfo, null).ToString();

到此:

result = meth.Invoke(orderUpdate, null).ToString();

Invoke的第一个参数是您正在操作的对象,该对象应该是您在静态代码示例中显示的orderUpdate对象,您可以直接调用LastModified。< / p>