Lazy <t>作为Lazy <object>可能吗?

时间:2016-12-09 18:22:48

标签: c# generics

是否可以投放With wSheet .UsedRange.Offset(3).Columns.AutoFit End With &gt;当我拥有的是一个对象引用时,实例作为Lazy<T? 返回null:

Lazy<object>

这对我有意义。它应该为null,因为它不是var result = obj as Lazy<object>; 。但是有没有另一种方法可以查询T实际上是什么或投射到对象?在这种情况下,我实际上并不在乎T实际上是什么。我只需要Lazy<object>参考。

一些背景

所以这真是一个好奇心问题。它可以应用于指定泛型的任何对象(即.Value)。但具体情况如下:
我在缓存中粘贴List<T>提供程序。我知道当我把它放进去时T是什么,我知道当我把它拉出来时,正常使用的是什么。 但是,在我管理缓存的一种情况下,我不知道T是什么,我真的不想与它进行交互,除非将其值发送给序列化程序。我只是担心我错过了一些明显的方法来实现这一点,而没有创建一种方法来提前跟踪它或改变一堆方法签名/调用。

3 个答案:

答案 0 :(得分:1)

您提出问题的方式,您需要使用反射(或表达式树)来执行此操作:

    Lazy<int> l = new Lazy<int>(() => 5);

    object o = l;

    object val = o.GetType().GetProperty("Value").GetGetMethod().Invoke(o, null);

答案 1 :(得分:1)

这是dynamic关键字的用途。它使用与@ SledgeHammer的答案相同的反射解决方案,除了它为getter委托有一个缓存,因此如果你对同一个T多次执行它,它会快得多。它也更短,更容易阅读(和写)。

object result = (obj as dynamic).Value;

答案 2 :(得分:0)

C#中的类不能协变,因此您无法将该对象实例视为Lazy<object>。您必须创建一个 Lazy对象,该对象只使用另一个Lazy来确定该值应该是什么。这样做很简单:

Lazy<T> oldLazy = ComputeOldLazy();
Lazy<object> newLazy = new Lazy<object>(() => oldLazy.Value);