4
class
XmlToEgg<T> where T :
class
{
可是光解决了实例类型的问题还是差一步啊,差点什么呢?对啊,那就是如何实例化一个泛型目标实例@H_502_8@。这也就是我们在实例化一个目标实例时遇到的第二个问题。@H_502_8@@H_502_8@
|
/// <summary>
/// Creates the class initiate.
/// </summary>
CreateInitiate()
Type t =
typeof
(T);
ConstructorInfo ct = t.GetConstructor(System.Type.EmptyTypes);
target = (T)ct.Invoke(
);
当然这里小匹夫假设我们的目标类的构造函数是不需要参数的,如果需要参数也很简单,看官们自己可以查到这里就不赘述了。@H_502_8@@H_502_8@
好了,到这里我们如何创建一个一开始我们不知道是什么类型,只有到创建的时候才知道是什么东西的类的实例的问题就解决了。(好绕)@H_502_8@@H_502_8@
问题三:如何为创建好的实例中的字段赋值@H_502_8@@H_502_8@@H_502_8@@H_502_8@
终于来到了我们的终极问题,也是我们最终的目标,实现从XML到目标类实例的最后一步。在问题二的时候已经说了,作为一个可以复用的工具,对处理的目标类型应该有包容性,那么既然连目标类型都不确定,那么目标类型的字段咋能确定呢?所以这个问题的本质其实就是我不知道目标类有啥字段啊@H_502_8@。。。(如果你把字段写死,是不是就没有一点扩展性了。。。low爆有木有),那问题连环一个接一个,我既然不知道目标类有啥字段,那我更不可能知道目标类的字段的类型了吧。@H_502_8@好,就算我啥都知道,我应该怎么设呢?直接用instance.field = XXX? 图样图森破。@H_502_8@@H_502_8@
所以问题的本质是明确的:@H_502_8@@H_502_8@
- 我不知道目标类有啥字段@H_502_8@
- 我不知道各个字段是啥类型@H_502_8@
- 就算1,2我都知道,但是我就是不知道咋把值赋给相应字段。@H_502_8@
正所谓“车到山前必有路,答案还是用反射”。只要能解决上面三个小问题,那么最后这一步就算是迈过去了。话不多说,下面上代码:@H_502_8@@H_502_8@
17
18
19
20
21
22
23
24
25
26
|
/// attribute assignment,
/// 由于反射中设置字段值的方法会涉及到赋值的目标类型和当前类型的转化,
/// 所以需要使用Convert.ChangeType进行类型转化
/// </summary>
T ToEgg()
{
(target !=
)
{
target =
;
}
CreateInitiate();
XElement xml = LoadXML();
Type t = target.GetType();
FieldInfo[] fields = t.GetFields();
fieldName =
.Empty;
foreach
(FieldInfo f
in
fields)
{
fieldName = f.Name;
(xml.Element(fieldName) !=
)
{
f.SetValue(target,Convert.ChangeType(xml.Element(fieldName).Value,f.FieldType));
}
}
target;
- Q:我不知道目标类有啥字段 A:拿到实例的Type,之后调用GetFields获取字段。@H_502_8@
- Q:我不知道各个字段是啥类型 A: 其实知道赋值目标字段类型的目的就是为了能把从XML中读取的元素Value类型转化为字段类型,所以问题就变成了如何把XML的元素Value类型转化为目标字段类型,所以字段类型为FieldInfo.FieldType,转化就是Convert.ChangeType(xml.Element(fieldName).Value,f.FieldType)。@H_502_8@
- Q:我不知道该如何给字段赋值 A:当然还是用反射,FieldInfo.SetValue(obj,obj)。@H_502_8@
这样,一个处理动态读取XML创建类实例并赋值的类或者说小工具XMLToEgg就完成了,下面是完整的代码以及测试。@H_502_8@@H_502_8@
当然,其实这里还有问题?辣是什么呢?看看小匹夫的上一篇文章《@H_502_8@匹夫细说unity3d(一)——移动平台动态读取外部文件全解析》http://www.unitymanual.com/thread-35771-1-1.html各位看官就会发现问题所在啦,当然小匹夫也相信各位一定能解决这个问题~@H_502_8@那么,下一篇文章见咯 @H_502_8@完整的项目代码以及使用方法、测试可以从这里获取:XMLToEgg (@H_502_8@https://github.com/chenjd/Unity3D_XMLToEgg)@H_502_8@ 也欢迎访问小匹夫的博客:http://www.cnblogs.com/murongxiaopifu/p/4175395.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@H_502_8@ 匹夫细说Unity3D(一)——移动平台动态读取外部文件全解析 http://www.unitymanual.com/thread-35771-1-1.html@H_502_8@ |