我遇到了一个更简单的问题,想要一个通用的静态方法来处理“可空”类型(可以是引用类型或 Nullables),这使我找到了这个没有令人满意的解决方案的问题。所以我想出了自己的解决方案,相对于 OP 所述的问题,我的解决方案相对容易解决,只需要两个重载的方法,一个使用约束
where T : class
接受
T
,另一个使用
where T : struct
接受
T?
。
然后我意识到,这个解决方案也可以应用于这个问题,通过将构造函数设为私有(或受保护)并使用静态工厂方法来创建一个在编译时可检查的解决方案:
public static class Foo
{
public static Foo<TFoo> Create<TFoo>(TFoo value)
where TFoo : class
{
return Foo<TFoo>.Create(value);
}
public static Foo<TFoo?> Create<TFoo>(TFoo? value)
where TFoo : struct
{
return Foo<TFoo?>.Create(value);
}
}
public class Foo<T>
{
private T item;
private Foo(T value)
{
item = value;
}
public bool IsNull()
{
return item == null;
}
internal static Foo<TFoo> Create<TFoo>(TFoo value)
where TFoo : class
{
return new Foo<TFoo>(value);
}
internal static Foo<TFoo?> Create<TFoo>(TFoo? value)
where TFoo : struct
{
return new Foo<TFoo?>(value);
}
}
现在我们可以像这样使用它:
var foo1 = new Foo<int>(1)
var foo2 = Foo.Create(2)
var foo3 = Foo.Create("")
var foo4 = Foo.Create(new object())
var foo5 = Foo.Create((int?)5)
如果您需要一个无参构造函数,那么就无法使用重载的便利性了,但是仍然可以做到像这样:
public static class Foo
public static Foo<TFoo?> CreateNullable<TFoo>()
where TFoo : struct
}
public class Foo<T>
public bool IsNull()
internal static Foo<TFoo> Create<TFoo>()
where TFoo : class
internal static Foo<TFoo?> CreateNullable<TFoo>()
where TFoo : struct
}
并像这样使用它:
var foo1 = new Foo<int>()
var foo2 = Foo.Create<int>()
var foo3 = Foo.Create<string>()
var foo4 = Foo.Create<object>()
var foo5 = Foo.CreateNullable<int>()
这种解决方案有几个缺点,其中之一是您可能更喜欢使用“new”来构造对象。另一个是您将无法将
Foo<T>
用作类型约束的通用类型参数,例如:
where TFoo: new()
。最后是您在此处需要的额外代码位,特别是如果您需要多个重载构造函数,则会增加代码量。
IFoo<T>
作为工作类型,并通过工厂方法创建实例?那样是可行的。 - JonIsItNull<T>(Nullable<T> i) where T : struct
和IsItNull<T>(T i) where T : class
。 - Guru Stron