这是一个实际示例,说明您希望如何拥有额外的构造函数类型参数以及解决方法。
我将为IDisposable介绍一个简单的RefCounted包装器:
public class RefCounted<T> where T : IDisposable
{
public RefCounted(T value)
{
innerValue = value;
refCount = 1;
}
public void AddRef()
{
Interlocked.Increment(ref refCount);
}
public void Dispose()
{
if(InterlockedDecrement(ref refCount)<=0)
innerValue.Dispose();
}
private int refCount;
private readonly innerValue;
}
这似乎很好。但迟早您希望将RefCounted<Control> 转换为RefCounted<Button>,同时保持两个对象引用计数,即仅当两个实例都被处置以处置底层对象时。
最好的方法是你会写(就像 C++ 人可以做的那样)
public RefCounted(RefCounted<U> other)
{
...whatever...
}
但是 C# 不允许这样做。所以解决方案是使用一些间接性。
private readonly Func<T> valueProvider;
private readonly Action disposer;
private RefCounted(Func<T> value_provider, Action disposer)
{
this.valueProvider = value_provider;
this.disposer = disposer;
}
public RefCounted(T value) : this(() => value, value.Dispose)
{
}
public RefCounted<U> Cast<U>() where U : T
{
AddRef();
return new RefCounted<U>(() => (U)(valueProvider()),this.Dispose);
}
public void Dispose(){
if(InterlockedDecrement(ref refCount)<=0)
disposer();
}
如果您的类有任何泛型类型的字段,您别无选择,只能将所有这些类型放入类中。但是,如果您只是想对构造函数隐藏某些类型,则需要使用上述技巧 - 使用隐藏构造函数将所有内容放在一起,并定义一个普通的泛型函数来调用该构造函数。