[英]Create instance of generic class based on nullable type
我想创建泛型函数,它将某些类型的值作为参数。
MyGenericClass<T>(parameter)
(参数也可以通过属性设置,这里不需要使用构造函数) MyGenericClass<NotNullType(T)>(parameter.Value)
例子 :for参数int? x,函数应该返回MyGenericClass<int>(x.Value)
。 这是我编写的代码,用于执行此类操作但未成功:
private MyGenericClass GetMyGenericClassOrNull<T> (T value) {
if (value != null) {
var underlyingType = Nullable.GetUnderlyingType(typeof(T));
if (underlyingType == null) {
return new MyGenericClass<T>(value);
} else {
return new MyGenericClass<underlyingType>(value);
}
}
return null;
}
正如你所期望的那样: return new MyGenericClass<underlyingType>(value);
这里有问题。
有没有办法做这样的事情?
你可以尝试:
public class MyGenericClass
{
}
public class MyGenericClass<T> : MyGenericClass
{
public MyGenericClass(T value)
{
}
}
public static MyGenericClass GetMyGenericClassOrNull<T>(T? value) where T : struct
{
if (value != null)
{
return new MyGenericClass<T>(value.Value);
}
return null;
}
public static MyGenericClass GetMyGenericClassOrNull<T>(T value)
{
if (value != null)
{
return new MyGenericClass<T>(value);
}
return null;
}
你有两个不同的方法。 可空类型将转到第一个类型,其中T
是不可为空的“基础”类型。
请注意,如果需要,可以使签名public static MyGenericClass<T>
没有任何问题。 目前尚不清楚MyGenericClass
是如何构建的。
您可以使用Type.MakeGenericType
创建泛型类型的实例。
您的方法存在问题: MyGenericClass<int?>
(例如)不是MyGenericClass<int>
。 不可能施放它们。 输入中的T
类型与其输出不同。 我通过提供辅助类型参数来忽略该问题,该参数现在解决了问题。
private static MyGenericClass<T2> GetMyGenericClassOrNull<T, T2>(T value)
{
if (value != null)
{
var underlyingType = Nullable.GetUnderlyingType(typeof(T));
if (underlyingType == null)
{
return new MyGenericClass<T2>((T2)(object)value);
}
else
{
Type t = typeof(MyGenericClass<>).MakeGenericType(underlyingType);
object o = Activator.CreateInstance(t, value);
return (MyGenericClass<T2>)o;
}
}
return null;
}
你可以像这样使用它:
var x = GetMyGenericClassOrNull<int?, int>(2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.