在泛型中使用原始类型或Type对象

时间:2012-09-27 05:52:03

标签: c# .net generics

如果给定的类型对象如

var myType = typeof(SomeClass)

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

例如

var myObject = container.Resolve<myType>()

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

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

3 个答案:

答案 0 :(得分: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作为替代方案 - 这取决于您之后尝试使用它做什么。

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

答案 1 :(得分:1)

如果container.Resolve表示UnityContainer.Resolve个家庭之一,而不是overload,则接受Type个实例:

var obj = container.Resolve(typeObj);

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

答案 2 :(得分:0)

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

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

你用它:

YourClass l = Resolve<YourClass>();

对于没有像

这样的参数的构造函数来说,这是一个非常简单的例子
public YourClass(){...}

您可以从herehere

开始阅读

你是否应该经常思考是否需要反思(考虑J.Skeet给出的答案)。