我有一个代表这样的 Sharepoint 列表的类:
private class ListColumns
{
public String li_requestDate { get; set; }
public String li_paymentAmount { get; set; }
public String li_payeeName { get; set; }
public String li_remitAddressOrMailStop { get; set; }
. . .
我阅读了以前保存到 Sharepoint 列表中的项目,如下所示:
private List<ListColumns> ReadFromList()
{
List<ListColumns> lcList = new List<ListColumns>();
using (SPSite site = new SPSite(siteUrl))
{
using (SPWeb web = site.RootWeb)
{
SPList list = web.Lists[listTitle];
SPListItemCollection SpListColl = list.Items;
foreach (SPListItem item in SpListColl)
{
ListColumns lc = new ListColumns();
lc.li_requestDate = item["RequestDate"].ToString();
lc.li_payeeName = item["PayeeName"].ToString();
lc.li_remitAddressOrMailStop = item["RemitAddressOrMailStop"].ToString();
. . .
如果分配给类成员的值是空字符串,则此代码崩溃 - IOW,尝试将空字符串分配给这些类成员中的任何一个会导致 ReadFromList() 的 catch 方法充当指向它的 GOTO 语句已达到(就此而言,没有收取 200 美元或任何金额)。
我可以用像这样的笨拙/乏味的代码来防止这种情况:
if (!(String.IsNullOrEmpty(item["RequestDate"].ToString())))
{
lc.li_requestDate = item["RequestDate"].ToString();
}
if (!(String.IsNullOrEmpty(item["PayeeName"].ToString())))
{
lc.li_payeeName = item["PayeeName"].ToString();
}
. . .
(等等等等 ad nauseum ad finitum adwords with friends &c)
...但是有一个暗示必须有一个“更好”的方法。谁能具体证实我的直觉?
更新
尝试亚历克斯的代码:
item.SetAsString("RequestDate", x => lc.li_requestDate = x);
如果值为空,我仍然会得到“对象引用未设置为对象的实例”。
MatteoSP 的代码:
Apply(item, "RequestDate", x => lc.li_requestDate = x);
...甚至不编译;我收到两个错误消息:
'DirectPaymentSectionsWebPart.DPSVisualWebPart.DPSVisualWebPartUserControl.Apply(System.Collections.Generic.IDictionary, string, System.Action)' 的最佳重载方法匹配有一些无效参数
-和:
参数 1:无法从 'Microsoft.SharePoint.SPListItem' 转换为 'System.Collections.Generic.IDictionary'
更新 2
我的 kludgy/verbose 代码,我认为至少可以工作:
if (!(String.IsNullOrEmpty(item["RemitAddressOrMailStop"].ToString())))
{
lc.li_remitAddressOrMailStop = item["RemitAddressOrMailStop"].ToString();
}
...也因钝的“对象引用未设置为对象的实例”反对而失败。
是否有必要通过在写入列表时为每个其他可能为空的值写一个“”(空格)来将 Kludginess 提升得更高?
更新 3
我也尝试了Shaw在此处发布的想法,但结果相同(崩溃,“对象引用未设置为对象的实例”)