2015-09-11 11 views
6

In Sharepoint Server-Side-Code, können Sie so etwas wie schreiben:Wie extrahiere ich den Typ aus einem Feld?

field.fieldvalueType 

das man manchmal die Art (Datetime, oder was auch immer) geben. Nervig, manchmal gibt es nur Null zurück (zum Beispiel das ID-Feld).

In CSOM haben Sie dieses Feld nicht. Allerdings gibt es TypeAsString, die Sharepoint-Typen wie gibt:

  • Computed
  • Integer
  • Hinweis

Was ich tun möchte greifen diese huge table from MSDN:

Und Extract "Int32", wenn ich weiß, dass es sich um ein "Integer" -Feld handelt, und extrahiere "System.String" aus der Notiz von SharePoint.

Diese irgendwie funktioniert, aber es ist die Mutter aller Hacks:

var myTempItem = list.AddItem(new ListItemCreationInformation()); 
myTempItem.Update(); 
context.ExecuteQuery(); 

context.Load(myTempItem); 
context.ExecuteQuery(); 

Nach der Erstellung können Sie:

myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName -> Gives->System.Int32

Nun, was das richtige ist Weg, es zu tun? Ich hoffe nur, dass die Antwort keine zehn Fuß lange Switch-Case-Anweisung ist.

Antwort

3

Da es keine SPField.FieldValueType property Pendants in Sharepoint CSOM API ist, zeigt die folgende Erweiterung Methode, wie sie auszuführen:

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]; 
     } 
    } 
} 

Nutzungs

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);  
    }   
} 
+0

Ich denke, manchmal gibt es einfach keinen faulen Ausweg. http://www.quote2day.com/wp-content/uploads/Photo-35.jpg – David

+1

:) Ich betrachte mich auch als eine faule Person, aber in diesem speziellen Fall scheint es der einzige Weg zu sein .. –

-1

Sie können den Typ des Feldes mit dem folgenden Code-Schnipsel erhalten:

item.Fields["Title"].FieldValueType.FullName 
+0

Hallo, hast du die Frage bitte gelesen? – David

+0

Sorry, ich bin verwirrt, was benötigt wird?Möchten Sie den Wert des Feldes erhalten? i, e: Rufen Sie einfach eine Methode auf, um den Wert zu erhalten, und gibt den Wert basierend auf dem Typ zurück? – ibrahims

+1

Sorry, aber die Frage ist ziemlich klar. Ihre Antwort ist * wörtlich * die zweite Zeile der Frage (was natürlich sehr frustrierend ist). Ich brauche den Typ des Feldes, ohne ein Listenelement zu erstellen. Lesen Sie die Frage nach einer Erklärung, warum Ihr Snippet nicht funktioniert. – David

0

Im Allgemeinen müssen Sie die Zuordnung Sie beschreiben tun, nicht die myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName Methode.

Der Grund ist, myTempItemCreated[fieldImTryingToGetTypeOf.Title].GetType().FullName wird in dem Szenario fehlschlagen, in dem der Feldwert (z. B. Title) für dieses bestimmte ListItem-Objekt null ist. (Während Titel im Allgemeinen nicht null ist, können andere Felder null sein und sind). Und offensichtlich gibt Null Ihnen kein Objekt, auf dem Sie die GetType() -Methode aufrufen können (Sie würden natürlich eine NullReferenceException erhalten).

Also, für eine allgemeine Lösung für das Problem, muss man tatsächlich den String von TypAsString des Listenfelds zugeordnet, Aufruf aus dem Listenobjekt/Listenfeld und nicht aus dem Listenelement.

1

Erweiterung auf @ Vadim Antwort, hier ist eine Version das erstellt nicht jedes Mal ein neues Wörterbuch, wenn die Erweiterungsmethode aufgerufen wird;

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]; 
     } 
    } 
} 
Verwandte Themen