コード スニペット: GenericInvoker を呼び出す前に、パラメーター オブジェクトを設定する
最終更新日: 2010年5月6日
適用対象: SharePoint Server 2010
以下のコード例は、GenericInvoker を呼び出す前に Parameters オブジェクトを設定する方法を示します。
前提条件:
Microsoft SharePoint Server 2010 あるいは Microsoft SharePoint Foundation 2010。
Microsoft .NET Framework 3.5 と Microsoft Visual Studio。
この例を使用するには
Visual Studio を開始し、C# コンソール アプリケーション プロジェクトを作成します。プロジェクトを作成するときに、[.NET Framework 3.5] を選択します。
[表示] メニューから、[プロパティ ページ] をクリックしてプロジェクト プロパティを表示します。
[ビルド] タブから、[プラットフォーム ターゲット] で、[Any CPU] を選択します。
プロジェクト プロパティ ウィンドウを閉じます。
[ソリューション エクスプローラー] の [参照設定] で、[System] と [System.Core] を除いて、すべてのプロジェクト参照を削除します。
プロジェクトに以下の参照を追加します。
Microsoft.BusinessData
Microsoft.SharePoint
System.Data
System.Web
System.Xml
この手順の最後に示すコードで、Program.cs で自動生成されたコードを置換します。
siteUrl、nameSpace、entityName、および methodInstanceName を有効な値で置換します。
以下の手順 4.、5.、6. のコードを必要に応じて編集します。手順 4.、5.、6. で入力されたデータは、BDC モデルの一般的な呼び出し元のメソッドに定義されたパラメーターと型に一致している必要があります。
F6 を押して、ソリューションをビルドします。
Ctrl+F5 を押して、例を実行します。
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.
}
}
}
}
}
便利で簡単な方法は、IMethodInstance.GetMethod().CreateDefaultParameterInstances(IMethodInstance) を使用することです。これは、モデルの既定値に基づいて完全にインスタンス化されたバックエンド引数の Object[] を返し、以下のコードに示すように、TypeReflector を使用してこれらの既定値を上書きまたは変更します。CreateDefaultParameterInstances() は、前述の手順 3. から 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);
}
}
}
}
}
関連項目
参照
GetDatabaseBackedMetadataCatalog(SPServiceContext)