繁体   English   中英

基于可空类型创建泛型类的实例

[英]Create instance of generic class based on nullable type

我想创建泛型函数,它将某些类型的值作为参数。

  • 这种类型可以是可空的。
  • 如果value为null,则函数应返回null。
  • 如果它不是null,并且它不是可空类型而不是函数应该返回MyGenericClass<T>(parameter) (参数也可以通过属性设置,这里不需要使用构造函数)
  • 如果它不是null,并且它的可空类型比函数应该返回类似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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM