我有一个通用类,如下所示
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>
}
如何实现这一目标
答案 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替换。