动态确定类型参数后返回泛型类型

本文关键字:返回 泛型类型 类型参数 动态 | 更新日期: 2023-09-27 18:33:26

>我有一个泛型类,如下所示

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

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

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

如何实现这一点

动态确定类型参数后返回泛型类型

你试图做的事情是不可能的。 虽然您可以在运行时为任意泛型类型参数创建泛型类型,但如下所示

public MyClass<object> ReturnWithDynamicParameterType(Type genericArgument)
{
    Type genericType = typeof(MyClass<>).MakeGenericType(genericArgument);
    return (MyClass<object>)Activator.CreateInstance(genericType);
}

这条return行将始终抛出InvalidCastException.正如李已经评论的那样,类是不变的。这意味着例如MyClass<object>MyClass<string>根本不是同一类型。它们甚至不是从彼此继承的。

即使是协方差也无济于事,因为类中的泛型参数不允许使用 out 关键字。

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

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

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。