我可以使用Type.InvokeMember通过反射来调用方法,并且它看起来非常健壮,例如处理param数组参数.但由于某种原因,它不处理可选参数.
是否有更好的内置方法来调用考虑可选参数的方法(可能使用DLR)?
我有一个现有的代码库,它将几个简单的类保存到磁盘上NetDataContractSerializer,但遗憾的是,这些类没有用[DataContract],而是用[Serializable].这工作正常,但现在我想为持久化类添加一些新属性,同时仍然能够读取旧版本生成的文件.
让我们说这是班级:
[Serializable]
public class Persisted
{
public int OldProperty {get;set;}
public int NewProperty {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我反序列化旧文件时,我得到一个异常,因为它们不包含NewProperty.这是有道理的.所以我想NewProperty忽略,但是虽然有一个[OptionalField]属性让序列化程序忽略缺少的字段,但它不能应用于属性 - 仅字段.
所以我想我会使用[DataContract]和[DataMember],它也有一个IsRequired属性,但这会改变序列化文件的布局,而且它无法读取旧的数据文件.此外,你不能混用[Serializable]和[DataMember]-如果串行看到[Serializable]属性,它忽略了[DataMember]指令.
因此,除非选择对旧文件进行一次性转换(可能,但不是我的第一选择),有没有办法让NetDataContractSerializer忽略现有XML序列化对象中的字段?
我读了Java:The Complete Reference(第9版).在字符5:控制语句 - 迭代多维数组部分写:
for的增强版本也适用于多维数组.但请记住,在Java中,多维数组由数组数组组成.(例如,二维数组是一维数组的数组.)这在迭代多维数组时很重要,因为每次迭代都会获得下一个数组,而不是单个元素.此外,for循环中的迭代变量必须与所获得的数组类型兼容.例如,在二维数组的情况下,迭代变量必须是对一维数组的引用.通常,当使用for-each迭代N维的数组时,获得的对象将是N-1维的数组.要了解这一点的含义,请考虑以下程序.它使用嵌套for循环以行顺序从第一个到最后一个获取二维数组的元素.
我无法理解为什么"迭代N维的数组,获得的对象将是N-1维的数组".这是真的吗?
我写了以下代码
List<Pupils> pupils = PupilsDAO.SelectDAO();
XElement dtpupil = new XElement("DtDatas",
from xlist in pupils
orderby xlist.Id
select new XElement("DtData",
new XElement("ref", xlist.Id),
new XElement("forename", xlist.Forename),
new XElement("surname", xlist.Surname)
)
);
Run Code Online (Sandbox Code Playgroud)
我没有为列表中的每个元素获取不同的XML对象,而是为列表中的每个项目获取输出,但它们都是相同的而不是实际迭代,所以只需加载...
<DtDatas>
<DtData>
<ref>01</ref>
<forename>joe</forename>
<surname>bloggs</surname>
</DtData>
<DtData>
<ref>01</ref>
<forename>joe</forename>
<surname>bloggs</surname>
</DtData>
<DtData>
<ref>01</ref>
<forename>joe</forename>
<surname>bloggs</surname>
</DtData>
<DtData>
<ref>01</ref>
<forename>joe</forename>
<surname>bloggs</surname>
</DtData>
</DtDatas>
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法?我是不是要为列表添加迭代?