是否可以投放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是什么,我真的不想与它进行交互,除非将其值发送给序列化程序。我只是担心我错过了一些明显的方法来实现这一点,而没有创建一种方法来提前跟踪它或改变一堆方法签名/调用。
答案 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);