1

我正在使用 Qt MetaObject System 进行 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;
  ...
}

Bind 方法存储关于类型的信息_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)?

4

2 回答 2

3

您不应该直接使用 QGenericArgument。有Q_ARG那个。

Q_ARG(QObject*, object)
于 2013-06-16T14:01:14.657 回答
1

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

于 2013-08-31T23:02:00.717 回答