Ran*_*dom 3 c# generics weak-references
我正在尝试WeakReference使用4.5泛型实现创建一个s 列表,以便我可以避免类型检查和WeakReference目标的转换.但是,WeakReference<T>似乎不支持协方差,所以我试图建立一个解决方法.
我认为它应该是可行的,因为每个T都是特定继承链中的类型.那么,我在想的就是这样:
public class Animal { }
public class Tiger : Animal { }
public class Wolf : Animal { }
var mylist = new List<WeakReference<Animal>>();
mylist.Add(new WeakReference<Animal>(new Animal()));
mylist.Add(new WeakReference<Tiger>(new Tiger()));
mylist.Add(new WeakReference<Wolf>(new Wolf()));
Run Code Online (Sandbox Code Playgroud)
我已经尝试为WeakReference创建一个包装类(因为它是不可继承的),但这不起作用.无论如何,列表不会接受任何WeakReference其他类型的WeakReference<Animal>.
我可以创建我自己的通用WeakReference实现,但这似乎是打败了这一点,因为我在其中进行类型转换.我找不到任何文档,但我有点假设框架版本更好地处理这个问题.
有没有另外一种方法可以解决这个问题,我没想到,或者我是在咆哮错误的树?
WeakReference是不变的,因为它允许设置值,如果它是协变的则不会有效.为了使其协变,您需要在引用周围创建一个只读包装器,并使用接口.
public interface IReadOnlyWeakReference<out T>
{
T Value { get; }
}
public class WeakReferenceWrapper<T> : IReadOnlyWeakReference<T>
where T : class
{
private WeakReference<T> reference;
public WeakReferenceWrapper(WeakReference<T> reference)
{
this.reference = reference;
}
public T Value
{
get
{
T output;
if (reference.TryGetTarget(out output))
return output;
else
return default(T);
}
}
}
Run Code Online (Sandbox Code Playgroud)
转换的扩展方法也有点方便:
public static IReadOnlyWeakReference<T> AsReadOnly<T>(
this WeakReference<T> reference)
where T : class
{
return new WeakReferenceWrapper<T>(reference);
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以写:
var mylist = new List<IReadOnlyWeakReference<Animal>>();
mylist.Add(new WeakReference<Animal>(new Animal()).AsReadOnly());
mylist.Add(new WeakReference<Tiger>(new Tiger()).AsReadOnly());
mylist.Add(new WeakReference<Wolf>(new Wolf()).AsReadOnly());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
920 次 |
| 最近记录: |