定义一个匿名方法如下:
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]]"}
有什么办法可以获取到真实的类型,
大哥,这就是他的类型啊,List<String>:`1代表泛型类型一个参数,[[System.String]]代表泛型类型是String。你就这样想就行了,泛型类型包含两个类型一个List一个String,所以要区分下就写成List`1
好了,给分吧
啥,如果你不能信服,我在给你截张图,你看看Dictionary,就更明白了:
因为类型是在匿名方法里面框架自己感知的,所以我想通过var type = result.GetType();获取到真实的类型。
我的目的是获取真实类型,然后放到数据库中,最后再反序列化回来,是不是说的有点晕?
@梦醒爱丽丝: 你的var result = accquire();得到的result不就是个List<String>吗?,你问的问题难道不是说类型加了个 `1吗?
我明白了你想要获取String这个类型是吧?
@SpringRen:
怎么样通过代码获取到类型?var type = result.GetType()获取不到
@梦醒爱丽丝:
这不是有类型吗?
@梦醒爱丽丝: 你想要的是这个吗,亲:
@SpringRen: 好吧,我的问题是另外一个问题,还是谢谢你,给你结贴了
@梦醒爱丽丝: 那我真不知道你想问什么问题了……额……
@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.
@梦醒爱丽丝: IPagedList是一个抽象类,反序列化的时候会尝试去实例化IPagedList,结果抽象类不能被实例化才报的错。所以你要使用IPagedList的实现类进行反序列化才行。
比如class MyList:IPagedList ,你反序列化使用T=MyList就行了
结合你上面的CachManager,我猜你应该是使用 IPageList<Customer>=new MyPageList<Cusmter>,是不是啊?
@SpringRen:
貌似找到问题的解决办法了
http://stackoverflow.com/questions/5780888/casting-interfaces-for-deserialization-in-json-net
@梦醒爱丽丝: 看了,终于明白你的问题是啥了。它是利用了JsonConvert,反序列化的时候自动按照实现类反序列化,如果不写那个带参构造函数,他就无法知道实现类是哪个了。恩恩,不错的!