Extrait de code : définir l’objet de paramètres avant d’appeler un GenericInvoker
Dernière modification : jeudi 6 mai 2010
S’applique à : SharePoint Server 2010
L’exemple de code suivant vous montre comment configurer l’objet Parameters avant d’appeler un GenericInvoker.
Conditions requises :
Microsoft SharePoint Server 2010 ou Microsoft SharePoint Foundation 2010.
Microsoft .NET Framework 3.5 et Microsoft Visual Studio.
Pour utiliser cet exemple
Démarrez Visual Studio et créez un projet d’application console C#. Sélectionnez .NET Framework 3.5 lors de la création du projet.
Dans le menu Affichage, cliquez sur Pages des propriétés pour afficher les propriétés du projet.
Dans l’onglet Version, pour l’option Plateforme cible, sélectionnez Tout processeur.
Fermez la fenêtre des propriétés du projet.
Dans Explorateur de solutions, sous Références, supprimez toutes les références de projet, sauf pour System et System.Core.
Ajoutez les références suivantes au projet :
Microsoft.BusinessData
Microsoft.SharePoint
System.Data
System.Web
System.Xml
Remplacez le code généré automatiquement dans Program.cs par le code figurant à la fin de cette procédure.
Remplacez siteUrl, nameSpace, entityName et methodInstanceName par des valeurs valides.
Modifiez le code pour les étapes 4, 5 et 6 ci-dessous. Les données entrées au cours des étapes 4, 5 et 6 doivent correspondre aux paramètres et types définis pour la méthode du GenericInvoker dans le modèle BDC.
Appuyez sur F6 pour générer la solution.
Appuyez sur Ctrl+F5 pour exécuter l’exemple.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.BusinessData.SharedService;
using Microsoft.BusinessData.MetadataModel;
using Microsoft.BusinessData.Runtime;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint;
using System.Web;
using Microsoft.BusinessData.MetadataModel.Collections;
using Microsoft.BusinessData.Infrastructure;
namespace Microsoft.SDK.Sharepoint.Samples
{
class Program
{
static void Main(string[] args)
{
string siteURL = "<siteUrl>";
string entityNS = "<nameSpace>";
string entityName = "<entityName>";
string methodInstanceName = "<methodInstanceName>";
using (SPSite site = new SPSite(siteURL))
{
using (new Microsoft.SharePoint.SPServiceContextScope(
SPServiceContext.GetContext(site)))
{
BdcService service =
SPFarm.Local.Services.GetValue<BdcService>
(String.Empty);
IMetadataCatalog catalog =
service.GetDatabaseBackedMetadataCatalog(
SPServiceContext.Current);
IEntity entity =
catalog.GetEntity(entityNS, entityName);
ILobSystemInstance LobSysteminstance =
entity.GetLobSystem().
GetLobSystemInstances()[0].Value;
// Step 1: Obtain the MethodInstance from Entity.
IMethodInstance myGenericInvoker =
entity.GetMethodInstance(
methodInstanceName,
MethodInstanceType.GenericInvoker);
// Step 2: Obtain the Parameters using the Method.
IParameterCollection parameters =
myGenericInvoker.GetMethod().GetParameters();
// Step 3: Create the Object[] that needs
// to be passed in.
Object[] rawParameters =
new Object[parameters.Count];
// Step 4: For simple types and known types you can
// just create the instance and assign it to the
// parameter.
// Known types are the types that are known to you at
// compile time. These are the types that are in .NET Framework,
// BDC, or assemblies in the global assembly cache. The types that are
// defined in your proxy are NOT known types, as BDC
// will generate another proxy for the Web service.
rawParameters[0] = 32;
rawParameters[1] = "A";
rawParameters[2] = new System.Data.DataTable("X");
// Step 5: For "unknown types" (such as types defined
// in your proxy), you need to access to the type
// reflector to instantiate the complex types
// defined in your proxy.
ITypeReflector reflector = parameters[3].TypeReflector;
ITypeDescriptor rootTypeDescriptor =
parameters[3].GetRootTypeDescriptor();
Object instance = reflector.Instantiate(
rootTypeDescriptor);
// Or if you want to have the instance object
// use default values
// defined in your model, use the following:
// Object instance =
// reflector.Instantiate(
// rootTypeDescriptor, myGenericInvoker);
// Or if the root of the parameter is a collection,
// use the following:
// Object instance =
// reflector.Instantiate(rootTypeDescriptor, 55);
// Or if the root of the parameter is a collection
// and you want to use default values,
// use the following:
// Object instance =
// reflector.Instantiate(
// rootTypeDescriptor, 55, myGenericInvoker);
rawParameters[3] = instance;
// Step 6: To set values in the complex object
// you’ve just created, you can use the Set
// method on TypeReflector.
ITypeDescriptor child =
rootTypeDescriptor.GetChildTypeDescriptors()[3];
// Alternatively you can look over them and
// check the name,
// but since you are using generic invoker,
// it is most likely that you have intimate
// knowledge of the method.
// If your object is a structure:
reflector.Set(
child, rootTypeDescriptor, ref instance, "value");
// Or if your object is a collection:
// reflector.Set(
// child, rootTypeDescriptor, ref instance,
// "value", /*index*/ 2);
// If you want to set values in deeper parts of
// the structure, you’ll need to navigate to the
// relevant type descriptors,
// and provide the corresponding root object,
// parent type descriptor and child type descriptor.
// You can also create instances of deeper
// TypeDescriptors and assign the created instances
// to parts of the structure using the Set method.
// NOTE: Repeat steps 5 and 6 for all the values
// you need to create and set.
}
}
}
}
}
Pour aller plus vite, vous pouvez utiliser IMethodInstance.GetMethod().CreateDefaultParameterInstances(IMethodInstance), qui renverra un Object[] d’arguments principaux entièrement instanciés, basés sur les valeurs par défaut du modèle, puis remplacer ou modifier ces valeurs par défaut à l’aide de TypeReflector, comme illustré dans le code ci-dessous. CreateDefaultParameterInstances() est un raccourci correspondant aux étapes 3 à 5 ci-dessus.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.BusinessData.SharedService;
using Microsoft.BusinessData.MetadataModel;
using Microsoft.BusinessData.Runtime;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint;
using System.Web;
namespace Microsoft.SDK.Sharepoint.Samples
{
class Program
{
static void Main(string[] args)
{
string siteURL = ""<siteUrl>";
string entityNS = "<nameSpace>";
string entityName = "<entityName>";
string methodInstanceName = "<methodInstanceName>";
using (SPSite site = new SPSite(siteURL))
{
using (new Microsoft.SharePoint.SPServiceContextScope(
SPServiceContext.GetContext(site)))
{
BdcService service =
SPFarm.Local.Services.GetValue<BdcService>(
String.Empty);
IMetadataCatalog catalog =
service.GetDatabaseBackedMetadataCatalog(
SPServiceContext.Current);
IEntity entity = catalog.GetEntity(
entityNS, entityName);
ILobSystemInstance LobSysteminstance =
entity.GetLobSystem().GetLobSystemInstances()
[0].Value;
// Step 1: Obtain the MethodInstance from the entity.
IMethodInstance myGenericInvoker =
entity.GetMethodInstance(
methodInstanceName, MethodInstanceType.GenericInvoker);
// Step 2: Obtain the Parameters using the Method.
IParameterCollection parameters =
myGenericInvoker.GetMethod().
CreateDefaultParameterInstances(IMethodInstance);
}
}
}
}
}
Voir aussi
Référence
GetDatabaseBackedMetadataCatalog(SPServiceContext)