首页 新闻 搜索 专区 学院

基础问题,关于匿名方法获取类型的问题

0
悬赏园豆:100 [已解决问题] 解决于 2016-05-25 21:17

定义一个匿名方法如下:

public class CachManager
    {
        public  T Get<T>(string key, Func<T> accquire)
        {
            var result = accquire();
            var type = result.GetType();
            return (T)result;
        }
    }

 调用方法如下:

CachManager cc = new CachManager();
            var result = cc.Get("key1", () => {
                List<string> val = new List<string>();
                val.Add("master");
                return val;
            });

 

为什么每次获取的type都会加`1,只有集合类型会出现这种问题

{Name = "List`1" FullName = "System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

有什么办法可以获取到真实的类型,

38号码农的主页 38号码农 | 初学一级 | 园豆:34
提问于:2016-05-25 20:05
< >
分享
最佳答案
0

大哥,这就是他的类型啊,List<String>:`1代表泛型类型一个参数,[[System.String]]代表泛型类型是String。你就这样想就行了,泛型类型包含两个类型一个List一个String,所以要区分下就写成List`1

好了,给分吧

 

啥,如果你不能信服,我在给你截张图,你看看Dictionary,就更明白了:

收获园豆:100
SpringRen | 菜鸟二级 |园豆:412 | 2016-05-25 20:34

因为类型是在匿名方法里面框架自己感知的,所以我想通过var type = result.GetType();获取到真实的类型。

我的目的是获取真实类型,然后放到数据库中,最后再反序列化回来,是不是说的有点晕?

38号码农 | 园豆:34 (初学一级) | 2016-05-25 20:39

@梦醒爱丽丝: 你的var result = accquire();得到的result不就是个List<String>吗?,你问的问题难道不是说类型加了个 `1吗?

 

我明白了你想要获取String这个类型是吧?

SpringRen | 园豆:412 (菜鸟二级) | 2016-05-25 20:44

@SpringRen: 

怎么样通过代码获取到类型?var type = result.GetType()获取不到

38号码农 | 园豆:34 (初学一级) | 2016-05-25 20:50

@梦醒爱丽丝: 

这不是有类型吗?

SpringRen | 园豆:412 (菜鸟二级) | 2016-05-25 20:53

@梦醒爱丽丝: 你想要的是这个吗,亲:

SpringRen | 园豆:412 (菜鸟二级) | 2016-05-25 21:01

@SpringRen: 好吧,我的问题是另外一个问题,还是谢谢你,给你结贴了

38号码农 | 园豆:34 (初学一级) | 2016-05-25 21:17

@梦醒爱丽丝: 那我真不知道你想问什么问题了……额……

SpringRen | 园豆:412 (菜鸟二级) | 2016-05-25 21:24

@SpringRen: 

问题就是当执行下面的语句的时候

JsonConvert.DeserializeObject<T>(jsonString)

出现错误如下:

Could not create an instance of type IPagedList`1[Customter]. Type is an interface or abstract class and cannot be instantiated. 

38号码农 | 园豆:34 (初学一级) | 2016-05-25 21:27

@梦醒爱丽丝: IPagedList是一个抽象类,反序列化的时候会尝试去实例化IPagedList,结果抽象类不能被实例化才报的错。所以你要使用IPagedList的实现类进行反序列化才行。

比如class MyList:IPagedList ,你反序列化使用T=MyList就行了

结合你上面的CachManager,我猜你应该是使用 IPageList<Customer>=new MyPageList<Cusmter>,是不是啊?

SpringRen | 园豆:412 (菜鸟二级) | 2016-05-25 21:34

@SpringRen: 

貌似找到问题的解决办法了

http://stackoverflow.com/questions/5780888/casting-interfaces-for-deserialization-in-json-net

38号码农 | 园豆:34 (初学一级) | 2016-05-25 21:52

@梦醒爱丽丝: 看了,终于明白你的问题是啥了。它是利用了JsonConvert,反序列化的时候自动按照实现类反序列化,如果不写那个带参构造函数,他就无法知道实现类是哪个了。恩恩,不错的!

SpringRen | 园豆:412 (菜鸟二级) | 2016-05-25 22:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册