抱歉找不到相关的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(...)
之类的操作(因为endpoint
是var
而某些 endpoint
没有特别是继承了 Update()方法。
是否可以使用Reflection运行该方法?语法可能是什么样的?
要点:
如何使用反射调用类型为Update()
的对象的方法(T
)(即我们在运行时之前不知道该对象)?
E.g。 endpoint.Update(...)
答案 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.
}
编辑:这假设您的泛型类型来自封闭类..它在您的示例中显示。