如何从字段中提取类型?
How do I extract the type from a field?
在 SharePoint Server 端代码中,您可以这样写:
field.fieldvalueType
它有时会为您提供类型(DateTime 或其他)。令人讨厌的是,有时,它只是 returns Null(例如,ID 字段)。
在 CSOM 中,您没有该字段。但是,TypeAsString
提供 SharePoint 类型,例如:
- 计算
- 整数
- 备注
我想做的是抓住这个 huge table from MSDN:
并在我知道我正在处理 "Integer" 字段时提取 "Int32",并从 SharePoint 的注释中提取 "System.String"。
这有点管用,但它是所有技巧之母:
var myTempItem = list.AddItem(new ListItemCreationInformation());
myTempItem.Update();
context.ExecuteQuery();
context.Load(myTempItem);
context.ExecuteQuery();
创建后可以使用:
myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName
-> 给予 -> System.Int32
现在,正确的做法是什么?我只是希望答案不是十英尺长的 switch case 语句。
您可以使用以下代码段获取字段类型:
item.Fields["Title"].FieldValueType.FullName
通常,您需要做您描述的映射,而不是 myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName
方法。
原因是,myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName
在特定 ListItem object 的字段值(例如标题)为空的情况下将失败。 (虽然标题通常不为空,但其他字段可以为空)。显然 null 不会给你一个 object ,你可以在上面调用 GetType() 方法(你显然会得到一个 NullReferenceException)。
因此,对于问题的一般解决方案,确实必须映射从列表字段的 TypeAsString 返回的字符串,从列表 object / 列表字段调用,而不是从列表项调用.
由于 SharePoint CSOM API 中没有 SPField.FieldValueType property 对应项,以下扩展方法演示了如何执行它:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SharePoint.Client;
using Field = Microsoft.SharePoint.Client.Field;
namespace SharePoint.Client.Extensions
{
public static class FieldExtensions
{
public static Type GetFieldValueType(this Field field)
{
var table = new Dictionary<FieldType, Type>();
table[FieldType.Guid] = typeof(Guid);
table[FieldType.Attachments] = typeof(bool);
table[FieldType.Boolean] = typeof(bool);
table[FieldType.Choice] = typeof (string);
table[FieldType.CrossProjectLink] = typeof(bool);
table[FieldType.DateTime] = typeof(DateTime);
table[FieldType.Lookup] = typeof(FieldLookupValue);
table[FieldType.ModStat] = typeof(int);
table[FieldType.MultiChoice] = typeof(string[]);
table[FieldType.Number] = typeof(double);
table[FieldType.Recurrence] = typeof(bool);
table[FieldType.Text] = typeof(string);
table[FieldType.URL] = typeof(FieldUrlValue);
table[FieldType.URL] = typeof(FieldUrlValue);
table[FieldType.User] = typeof(FieldUserValue);
table[FieldType.WorkflowStatus] = typeof(int);
table[FieldType.ContentTypeId] = typeof(ContentTypeId);
table[FieldType.Note] = typeof(string);
table[FieldType.Counter] = typeof(int);
table[FieldType.Computed] = typeof(string);
table[FieldType.Integer] = typeof(int);
table[FieldType.File] = typeof(string);
if (!table.ContainsKey(field.FieldTypeKind))
throw new NotSupportedException(string.Format("Unknown field type: {0}", field.FieldTypeKind));
return table[field.FieldTypeKind];
}
}
}
用法
var list = ctx.Web.Lists.GetByTitle(listTitle);
var fields = list.Fields;
ctx.Load(fields);
ctx.ExecuteQuery();
foreach (var field in fields)
{
if (field.FieldTypeKind != FieldType.Invalid)
{
var fieldValueType = field.GetFieldValueType();
Console.WriteLine("{0} : {1}", field.InternalName, fieldValueType);
}
}
扩展@Vadim的答案,这里是一个版本,每次调用扩展方法时都不会构造新字典;
namespace SharePoint.Client.Extensions
{
public static class FieldExtensions
{
private static Dictionary<FieldType, Type> _fieldTypes = new Dictionary<FieldType, Type>()
{
{ FieldType.Guid, typeof(Guid) },
{ FieldType.Attachments, typeof(bool)},
{FieldType.Boolean, typeof(bool)},
{FieldType.Choice, typeof(string)},
{FieldType.CrossProjectLink, typeof(bool)},
{FieldType.DateTime, typeof(DateTime)},
{FieldType.Lookup, typeof(FieldLookupValue)},
{FieldType.ModStat, typeof(int)},
{FieldType.MultiChoice, typeof(string[])},
{FieldType.Number, typeof(double)},
{FieldType.Recurrence, typeof(bool)},
{FieldType.Text, typeof(string)},
{FieldType.URL, typeof(FieldUrlValue)},
{FieldType.User, typeof(FieldUserValue)},
{FieldType.WorkflowStatus, typeof(int)},
{FieldType.ContentTypeId, typeof(ContentTypeId)},
{FieldType.Note, typeof(string)},
{FieldType.Counter, typeof(int)},
{FieldType.Computed, typeof(string)},
{FieldType.Integer, typeof(int)},
{FieldType.File, typeof(string)}
};
public static Type GetFieldValueType(this Field field)
{
if (!_fieldTypes.ContainsKey(field.FieldTypeKind))
throw new NotSupportedException(string.Format("Unknown field type: {0}", field.FieldTypeKind));
return _fieldTypes[field.FieldTypeKind];
}
}
}
在 SharePoint Server 端代码中,您可以这样写:
field.fieldvalueType
它有时会为您提供类型(DateTime 或其他)。令人讨厌的是,有时,它只是 returns Null(例如,ID 字段)。
在 CSOM 中,您没有该字段。但是,TypeAsString
提供 SharePoint 类型,例如:
- 计算
- 整数
- 备注
我想做的是抓住这个 huge table from MSDN:
并在我知道我正在处理 "Integer" 字段时提取 "Int32",并从 SharePoint 的注释中提取 "System.String"。
这有点管用,但它是所有技巧之母:
var myTempItem = list.AddItem(new ListItemCreationInformation());
myTempItem.Update();
context.ExecuteQuery();
context.Load(myTempItem);
context.ExecuteQuery();
创建后可以使用:
myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName
-> 给予 -> System.Int32
现在,正确的做法是什么?我只是希望答案不是十英尺长的 switch case 语句。
您可以使用以下代码段获取字段类型:
item.Fields["Title"].FieldValueType.FullName
通常,您需要做您描述的映射,而不是 myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName
方法。
原因是,myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName
在特定 ListItem object 的字段值(例如标题)为空的情况下将失败。 (虽然标题通常不为空,但其他字段可以为空)。显然 null 不会给你一个 object ,你可以在上面调用 GetType() 方法(你显然会得到一个 NullReferenceException)。
因此,对于问题的一般解决方案,确实必须映射从列表字段的 TypeAsString 返回的字符串,从列表 object / 列表字段调用,而不是从列表项调用.
由于 SharePoint CSOM API 中没有 SPField.FieldValueType property 对应项,以下扩展方法演示了如何执行它:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SharePoint.Client;
using Field = Microsoft.SharePoint.Client.Field;
namespace SharePoint.Client.Extensions
{
public static class FieldExtensions
{
public static Type GetFieldValueType(this Field field)
{
var table = new Dictionary<FieldType, Type>();
table[FieldType.Guid] = typeof(Guid);
table[FieldType.Attachments] = typeof(bool);
table[FieldType.Boolean] = typeof(bool);
table[FieldType.Choice] = typeof (string);
table[FieldType.CrossProjectLink] = typeof(bool);
table[FieldType.DateTime] = typeof(DateTime);
table[FieldType.Lookup] = typeof(FieldLookupValue);
table[FieldType.ModStat] = typeof(int);
table[FieldType.MultiChoice] = typeof(string[]);
table[FieldType.Number] = typeof(double);
table[FieldType.Recurrence] = typeof(bool);
table[FieldType.Text] = typeof(string);
table[FieldType.URL] = typeof(FieldUrlValue);
table[FieldType.URL] = typeof(FieldUrlValue);
table[FieldType.User] = typeof(FieldUserValue);
table[FieldType.WorkflowStatus] = typeof(int);
table[FieldType.ContentTypeId] = typeof(ContentTypeId);
table[FieldType.Note] = typeof(string);
table[FieldType.Counter] = typeof(int);
table[FieldType.Computed] = typeof(string);
table[FieldType.Integer] = typeof(int);
table[FieldType.File] = typeof(string);
if (!table.ContainsKey(field.FieldTypeKind))
throw new NotSupportedException(string.Format("Unknown field type: {0}", field.FieldTypeKind));
return table[field.FieldTypeKind];
}
}
}
用法
var list = ctx.Web.Lists.GetByTitle(listTitle);
var fields = list.Fields;
ctx.Load(fields);
ctx.ExecuteQuery();
foreach (var field in fields)
{
if (field.FieldTypeKind != FieldType.Invalid)
{
var fieldValueType = field.GetFieldValueType();
Console.WriteLine("{0} : {1}", field.InternalName, fieldValueType);
}
}
扩展@Vadim的答案,这里是一个版本,每次调用扩展方法时都不会构造新字典;
namespace SharePoint.Client.Extensions
{
public static class FieldExtensions
{
private static Dictionary<FieldType, Type> _fieldTypes = new Dictionary<FieldType, Type>()
{
{ FieldType.Guid, typeof(Guid) },
{ FieldType.Attachments, typeof(bool)},
{FieldType.Boolean, typeof(bool)},
{FieldType.Choice, typeof(string)},
{FieldType.CrossProjectLink, typeof(bool)},
{FieldType.DateTime, typeof(DateTime)},
{FieldType.Lookup, typeof(FieldLookupValue)},
{FieldType.ModStat, typeof(int)},
{FieldType.MultiChoice, typeof(string[])},
{FieldType.Number, typeof(double)},
{FieldType.Recurrence, typeof(bool)},
{FieldType.Text, typeof(string)},
{FieldType.URL, typeof(FieldUrlValue)},
{FieldType.User, typeof(FieldUserValue)},
{FieldType.WorkflowStatus, typeof(int)},
{FieldType.ContentTypeId, typeof(ContentTypeId)},
{FieldType.Note, typeof(string)},
{FieldType.Counter, typeof(int)},
{FieldType.Computed, typeof(string)},
{FieldType.Integer, typeof(int)},
{FieldType.File, typeof(string)}
};
public static Type GetFieldValueType(this Field field)
{
if (!_fieldTypes.ContainsKey(field.FieldTypeKind))
throw new NotSupportedException(string.Format("Unknown field type: {0}", field.FieldTypeKind));
return _fieldTypes[field.FieldTypeKind];
}
}
}