如果您给定一个类型对象,例如
var myType = typeof(SomeClass)
是否可以获得原始类型,作为接口或类并在泛型中使用它。
例如
var myObject = container.Resolve<myType>()
所以这会在这种情况下创建一个 SomeClass 类型的对象。
为了澄清我正在尝试围绕 Ioc 容器创建一个包装器,以便 Ioc 框架可以更改而不影响任何其他代码。
完全不清楚“获取原始类型”是什么意思 - 但如果您想在泛型中使用该类型,您通常需要使用反射。例如:
var methodDefinition = container.GetType().GetMethod("Resolve");
var constructedMethod = methodDefinition.MakeGenericMethod(method);
object myObject = constructedMethod.Invoke(container, null);
变量的类型myObject
只能是有用object
的 - 变量的类型必须在编译时知道(尽管它可能是通用的)。如果您使用的是 C# 4 和 .NET 4+,您可能会使用dynamic
它作为替代方案 - 这取决于您之后尝试使用它做什么。
如果您发现自己必须使用相同的类型参数进行多次反射调用,请考虑将逻辑提取到新的泛型方法中 - 然后您可以使用一次反射来调用该方法,然后在方法中使用普通泛型。
如果container.Resolve
是指UnityContainer.Resolve
家庭中的一员,则有超载,它接受Type
实例:
var obj = container.Resolve(typeObj);
这是 DI 或 IoC 容器的一个常见特性——具有耦合的分辨率重载、通用用例和非通用用例。
我想,你需要这样的东西:
T Resolve<T>()
{
var myType = typeof(T);
return (T)myType.GetConstructor(new Type[] { }).Invoke(new object[] { });
}
你使用它:
YourClass l = Resolve<YourClass>();
对于没有类似参数的构造函数来说,这是一个非常简单的示例
public YourClass(){...}
无论您是否需要反思,您都应该始终仔细考虑它(考虑 J.Skeet 给出的答案)。