如何调用通用对象的已知方法

时间:2014-09-24 05:43:50

标签: c# reflection

抱歉找不到相关的SO问题。

我使用Reflection来获取object的属性(这是另一个对象),使用:

public static T GetPropertyValue<T>(this object obj, string propertyName)
{
    PropertyInfo prop = obj.GetType().GetProperty(propertyName);
    return (T)prop.GetValue(obj, null);
}

我有一个(Xero)Api看起来像:

public class XeroCoreApi : XeroApi
{
    public AccountsEndpoint Accounts { get; }
    public ContactsEndpoint Contacts { get; }
    // ...
}

Endpoint s继承一个类似于的类:

public abstract class XeroUpdateEndpoint
{
    public TResult Update(TResult item);
    // ...
}

即。我可以调用特定实体的更新:

Contacts.Update(...);

当我调用GetPropertyValue()方法时,我从Endpoint的实例中获取XeroCoreApi对象,但我不知道它是方法(真的我这样做,但编译器没有)直到运行时。

要获得Endpoint我运行类似于以下命令的命令:

var endpoint = _api.GetPropertyValue<object>("Contacts");
// For the sake of this example the "Contacts" is manually
// entered, violating the whole idea of generics

问题是我无法执行endpoint.Update(...)之类的操作(因为endpointvar某些 endpoint没有特别是继承了 Update()方法。

是否可以使用Reflection运行该方法?语法可能是什么样的?

要点:

如何使用反射调用类型为Update()的对象的方法(T)(即我们在运行时之前不知道该对象)?

E.g。 endpoint.Update(...)

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你需要generic type constraints(不是反思)。这为编译器提供了类型满足某些条件的证明。

例如,界面:

public interface IUpdateStuff {
    void Update();
}

public class XeroCoreApi : XeroApi, IUpdateStuff {
    // implementation here
}

然后你可以限制你的泛型类型:

public TResult Update(TResult item) where TResult : IUpdateStuff ;

现在编译器会让你:

public TResult Update(TResult item) where TResult : IUpdateStuff {
    item.Update(); // <-- this is okay now.
}

编辑:这假设您的泛型类型来自封闭类..它在您的示例中显示。