动态确定类型参数后返回通用类型

时间:2016-02-05 13:15:52

标签: c# generics

我有一个通用类,如下所示

public class MyClass<T>
{
    public T MyProp { get; set; }
}

现在我想返回此类型的实例,并在运行时确定type参数,如下所示

public MyClass<object> ReturnWithDynamicParameterType()
{
    //This function determines the type of T at runtime and should return instance of MyClass<T>
}

如何实现这一目标

2 个答案:

答案 0 :(得分:2)

您要做的是不可能。虽然您可以在运行时为此

创建任意泛型类型参数的泛型类型
public MyClass<object> ReturnWithDynamicParameterType(Type genericArgument)
{
    Type genericType = typeof(MyClass<>).MakeGenericType(genericArgument);
    return (MyClass<object>)Activator.CreateInstance(genericType);
}

return行始终会抛出InvalidCastException。正如Lee已经评论过的那样,课程是不变的。这意味着,例如MyClass<object>MyClass<string>只是不是相同的类型。他们彼此甚至没有继承

即使是协方差也不会有帮助,因为类中的泛型参数不允许使用out关键字。

在编译时不知道类型的情况下,我没有看到解决方案。但我确信你可以通过其他方法解决你实际试图实现的目标。

答案 1 :(得分:1)

我不确定这是否适合您的使用,但您唯一的出路是使用协变的界面。

public interface IMyClass<out T>
{
    T MyProp { get; }
}

public class MyClass<T> : IMyClass<T>
{
    public T MyProp { get; set; }
}

public IMyClass<object> ReturnWithDynamicParameterType()
{
    //This function determines the type of T at runtime and should return instance of MyClass<T>

    return new MyClass<string>();
}

此代码编译是因为您的返回类型不是类,而是协变接口(请注意类型参数上的out T)。该接口仅允许检索,因此属性上的get;set已被接口上的get替换。