首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Lazy<T>作为Lazy<object>可能吗?

Lazy<T>作为Lazy<object>可能吗?
EN

Stack Overflow用户
提问于 2016-12-09 18:22:48
回答 3查看 201关注 0票数 1

当我只有一个对象引用时,是否可以将一个Lazy<T>实例转换为一个Lazy<object>?这将返回null:

代码语言:javascript
运行
复制
var result = obj as Lazy<object>;

这对我来说很有意义。它应该是空的,因为它不是Lazy<object>。但是,是否有另一种方式来询问,以找出T实际上是什么,或投给对象?我其实不在乎T在这种情况下到底是什么。我只需要.Value的参考。

一些背景

所以这真的是个好奇的问题。它可以应用于指定泛型(即List<T>)的任何对象。但具体情况如下:

我要在缓存中插入一个Lazy<T>提供程序。当我把它放进去的时候,我知道T是什么,当我拔出它的时候,我知道T在正常使用中是什么。但是,在一种情况下,当我管理缓存时,我不知道T是什么,而且实际上我不想与它交互,只想将它的值发送到序列化程序。我只是担心,我错过了一些显而易见的方法来实现这一点,而没有创建一种方法来提前跟踪它或更改一堆方法签名/调用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-09 18:59:16

这就是dynamic关键字的作用所在。它在下面使用的反射解决方案与@ T的答案相同,只不过它为getter委托提供了一个缓存,因此,如果您对同一个执行不止一次的反射解决方案,那么速度要快得多。它也更短,更容易读(和写)。

代码语言:javascript
运行
复制
object result = (obj as dynamic).Value;
票数 2
EN

Stack Overflow用户

发布于 2016-12-09 18:47:55

按照您提出问题的方式,您需要使用反射(或表达式树)来做到这一点:

代码语言:javascript
运行
复制
    Lazy<int> l = new Lazy<int>(() => 5);

    object o = l;

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

Stack Overflow用户

发布于 2016-12-09 18:24:50

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

代码语言:javascript
运行
复制
Lazy<T> oldLazy = ComputeOldLazy();
Lazy<object> newLazy = new Lazy<object>(() => oldLazy.Value);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41066612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档