Fragmento de código: Establecer el objeto Parameters antes de llamar a un GenericInvoker
Última modificación: jueves, 06 de mayo de 2010
Hace referencia a: SharePoint Server 2010
En el ejemplo de código siguiente se muestra cómo establecer el objeto Parameters antes de llamar a un GenericInvoker.
Requisitos previos:
Microsoft SharePoint Server 2010 o Microsoft SharePoint Foundation 2010.
Microsoft .NET Framework 3.5 y Microsoft Visual Studio.
Para usar este ejemplo
Inicie Visual Studio y cree un nuevo proyecto de aplicación de consola C#. Seleccione .NET Framework 3.5 cuando cree el proyecto.
En el menú Ver, haga clic en Páginas de propiedades para que aparezcan las propiedades del proyecto.
En la ficha Compilación, para el Destino de la plataforma, seleccione Any CPU.
Cierre la ventana de propiedades del proyecto.
En el Explorador de soluciones, en Referencias, quite todas las referencias del proyecto excepto System y System.Core.
Agregue las siguientes referencias al proyecto:
Microsoft.BusinessData
Microsoft.SharePoint
System.Data
System.Web
System.Xml
Reemplace el código generado automáticamente en Program.cs con el código que aparece al final de este procedimiento.
Reemplace siteUrl, nameSpace, entityName y methodInstanceName por valores válidos.
Edite el código para los pasos 4, 5 y 6, según corresponda. Los datos especificados en los pasos 4, 5 y 6 deben coincidir con los parámetros y tipos definidos para el método del invocador genérico en el modelo BDC.
Presione F6 para crear la solución.
Presione CTRL+F5 para ejecutar el ejemplo.
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.
}
}
}
}
}
Un método abreviado útil es usar IMethodInstance.GetMethod().CreateDefaultParameterInstances(IMethodInstance), que devolverá un Object[] de argumentos back-end con instancia en función de los valores predeterminados del modelo, y después invalidar o cambiar estos valores predeterminados mediante TypeReflector, tal como se muestra en el siguiente código. CreateDefaultParameterInstances() es un método abreviado para los pasos anteriores 3 a 5.
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);
}
}
}
}
}
Vea también
Referencia
GetDatabaseBackedMetadataCatalog(SPServiceContext)