0

如果您给定一个类型对象,例如

var myType = typeof(SomeClass)

是否可以获得原始类型,作为接口或类并在泛型中使用它。

例如

var myObject = container.Resolve<myType>()

所以这会在这种情况下创建一个 SomeClass 类型的对象。

为了澄清我正在尝试围绕 Ioc 容器创建一个包装器,以便 Ioc 框架可以更改而不影响任何其他代码。

4

3 回答 3

1

完全不清楚“获取原始类型”是什么意思 - 但如果您想在泛型中使用该类型,您通常需要使用反射。例如:

var methodDefinition = container.GetType().GetMethod("Resolve");
var constructedMethod = methodDefinition.MakeGenericMethod(method);
object myObject = constructedMethod.Invoke(container, null);

变量的类型myObject只能是有用object的 - 变量的类型必须在编译时知道(尽管它可能是通用的)。如果您使用的是 C# 4 和 .NET 4+,您可能会使用dynamic它作为替代方案 - 这取决于您之后尝试使用它做什么。

如果您发现自己必须使用相同的类型参数进行多次反射调用,请考虑将逻辑提取到新的泛型方法中 - 然后您可以使用一次反射来调用该方法,然后在方法中使用普通泛型。

于 2012-09-27T05:54:51.177 回答
1

如果container.Resolve是指UnityContainer.Resolve家庭中的一员,则有超载,它接受Type实例:

var obj = container.Resolve(typeObj);

这是 DI 或 IoC 容器的一个常见特性——具有耦合的分辨率重载、通用用例和非通用用例。

于 2012-09-27T06:04:10.180 回答
0

我想,你需要这样的东西:

T Resolve<T>()
{
    var myType = typeof(T);
    return (T)myType.GetConstructor(new Type[] { }).Invoke(new object[] { });
}

你使用它:

YourClass l = Resolve<YourClass>();

对于没有类似参数的构造函数来说,这是一个非常简单的示例

public YourClass(){...}

你可以从这里这里开始阅读

无论您是否需要反思,您都应该始终仔细考虑它(考虑 J.Skeet 给出的答案)。

于 2012-09-27T05:59:02.830 回答