如何从QObject *转换为QGenericArgument用于递归QMetaObject :: newInstance(...)

时间:2013-06-16 13:53:20

标签: c++ qt dependency-injection inversion-of-control

我正在使用Qt MetaObject系统进行DI IoC开发。

class Resolver
{
public:
  template <typename BaseType, typename DerivedType>
  void Bind() { ... }

  template <typename T>
  T* Resolve() { ... }
  ...

private:
  QObject* ResolveByName(QString typeName) { ... }
  QHash<QString, QMetaObject> _container;
  ...
}

绑定方法存储有关_container中类型的信息,Resolve方法使用此信息来创建实例。 我正在使用QMetaObject::newInstance(QGenericArgumet arg1, QGenericArgumet arg2, ...)和递归构造函数参数解析。 例如,我们有这样的类:

class IUserService { ... }

class NativeUserService : public IUserService
{
  NativeUserService(IUserRepository* userRepository) { ... }
}

客户致电后:

IUserService* userService = resolver.Resolve<IUserService>();

Resolver calls ResolveByName("IUserService*"):

QObject* ResolveByName(Qstring typeName)
{
  QMetaObject meta = _container.value(typeName);
  ...
  for (quint8 index = 0; index < 10; index++)
  {
    ...
    QString argType = constructorType.parameterTypes().at(index);
    QObject *argValue = ResolveByName(argType);
    ctorArgs << QGenericArgument(???);
  }
  ...
  return meta.newInstance(ctorArgs[0], ctorArgs[1], ...);
}

问题: 如何将meta.newInstance()结果传递给meta.newInstance()参数(从QObject*转换为QGenericArgument)?

2 个答案:

答案 0 :(得分:3)

您不应直接使用QGenericArgument。对此有Q_ARG

Q_ARG(QObject*, object)

答案 1 :(得分:1)

我解决了我的问题。关键是使用static_cast<const void *>(&argValue)。您可以在此处找到更多详细信息QtDependencyResolver