言語:VC++ / Ver:2008 / プラットフォーム:Windows XP
お世話になります。
現在、WCFにてプロセス間通信プログラムを作成しています。
通信上で受け渡すユーザ定義型のクラスを以下のようにDataContractで定義しています。
このユーザ定義型のフィールドにはEnumを含んでいます。
これを利用しホストサービスを起動して、SvcUtil.exeでクライアントコードを出力しましたが、
EnumがObjectとして解釈されてしまいます。
SvcUtil.exeを利用することを前提として、
Enumをクライアント側でもユーザ定義したStatusとして解釈させる事はできないのでしょうか?
EnumをDataMemberとして利用することは可能とありましたが。。
msdn.microsoft.com/ja-jp/library/aa347875%28VS.80%29.aspx
---以下、ソースです。
[DataContract]
public enum class Status
{
[EnumMember]
STATUS0 = 0,
[EnumMember]
STATUS1 = 1,
[EnumMember]
STATUS2 = 2
};
[DataContract]
public ref class TranceferData
{
private :
Status^ _status;
public:
[DataMember]
property Status^ status
{
Status^ get() {
return this->_status;
}
void set(Status^ status) {
this->_status = status;
}
}
};
[ServiceContract(SessionMode = SessionMode::Required)]
public interface class ISampleService
{
[OperationContract]
TranceferData^ getStatus();
};
[ServiceBehavior(InstanceContextMode=InstanceContextMode::Single,
ConcurrencyMode=ConcurrencyMode::Reentrant)]
public ref class SampleService : public ISampleService
{
public :
virtual TranceferData^ getStatus()
{
TranceferData^ data = gcnew TranceferData();
data->status = Status::STATUS0;
return data;
}
};
---SvcUtil.exeで出力されたコードです。
#pragma once
#using <mscorlib.dll>
#using <System.ServiceModel.dll>
#using <System.Runtime.Serialization.dll>
#using <System.dll>
using namespace System::Security::Permissions;
[assembly:SecurityPermissionAttribute(SecurityAction::RequestMinimum, SkipVerification=false)];
namespace Service {
ref class TranceferData;
}
interface class ISampleService;
interface class ISampleServiceChannel;
ref class SampleServiceClient;
namespace Service {
using namespace System::Runtime::Serialization;
using namespace System;
ref class TranceferData;
[System::Diagnostics::DebuggerStepThroughAttribute,
System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.Runtime.Serialization", L"3.0.0.0"),
System::Runtime::Serialization::DataContractAttribute(Name=L"TranceferData", Namespace=L"http://schemas.datacontract.org/2004/07/Service")]
public ref class TranceferData : public System::Object, public System::Runtime::Serialization::IExtensibleDataObject
{
private: System::Runtime::Serialization::ExtensionDataObject^ extensionDataField;
private: System::Object^ statusField;
public: virtual property System::Runtime::Serialization::ExtensionDataObject^ ExtensionData
{
System::Runtime::Serialization::ExtensionDataObject^ get() sealed;
System::Void set(System::Runtime::Serialization::ExtensionDataObject^ value) sealed;
}
public: [System::Runtime::Serialization::DataMemberAttribute]
property System::Object^ status
{
System::Object^ get();
System::Void set(System::Object^ value);
}
};
}
namespace Service {
inline System::Runtime::Serialization::ExtensionDataObject^ TranceferData::ExtensionData::get()
{
return this->extensionDataField;
}
inline System::Void TranceferData::ExtensionData::set(System::Runtime::Serialization::ExtensionDataObject^ value)
{
this->extensionDataField = value;
}
inline System::Object^ TranceferData::status::get()
{
return this->statusField;
}
inline System::Void TranceferData::status::set(System::Object^ value)
{
this->statusField = value;
}
}
using namespace System;
interface class ISampleService;
interface class ISampleServiceChannel;
ref class SampleServiceClient;
[System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.ServiceModel", L"3.0.0.0"),
System::ServiceModel::ServiceContractAttribute(ConfigurationName=L"ISampleService", SessionMode=System::ServiceModel::SessionMode::Required)]
public interface class ISampleService
{
[System::ServiceModel::OperationContractAttribute(Action=L"http://tempuri.org/ISampleService/getStatus", ReplyAction=L"http://tempuri.org/ISampleService/getStatusResponse")]
Service::TranceferData^ getStatus();
};
[System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.ServiceModel", L"3.0.0.0")]
public interface class ISampleServiceChannel : public ISampleService, public System::ServiceModel::IClientChannel
{
};
[System::Diagnostics::DebuggerStepThroughAttribute,
System::CodeDom::Compiler::GeneratedCodeAttribute(L"System.ServiceModel", L"3.0.0.0")]
public ref class SampleServiceClient : public System::ServiceModel::ClientBase<ISampleService^ >, public ISampleService
{
public: SampleServiceClient();
public: SampleServiceClient(System::String^ endpointConfigurationName);
public: SampleServiceClient(System::String^ endpointConfigurationName, System::String^ remoteAddress);
public: SampleServiceClient(System::String^ endpointConfigurationName, System::ServiceModel::EndpointAddress^ remoteAddress);
public: SampleServiceClient(System::ServiceModel::Channels::Binding^ binding, System::ServiceModel::EndpointAddress^ remoteAddress);
public: virtual Service::TranceferData^ getStatus() sealed;
};
inline SampleServiceClient::SampleServiceClient()
{
}
inline SampleServiceClient::SampleServiceClient(System::String^ endpointConfigurationName) :
System::ServiceModel::ClientBase<ISampleService^ >(endpointConfigurationName)
{
}
inline SampleServiceClient::SampleServiceClient(System::String^ endpointConfigurationName, System::String^ remoteAddress) :
System::ServiceModel::ClientBase<ISampleService^ >(endpointConfigurationName, remoteAddress)
{
}
inline SampleServiceClient::SampleServiceClient(System::String^ endpointConfigurationName, System::ServiceModel::EndpointAddress^ remoteAddress) :
System::ServiceModel::ClientBase<ISampleService^ >(endpointConfigurationName, remoteAddress)
{
}
inline SampleServiceClient::SampleServiceClient(System::ServiceModel::Channels::Binding^ binding, System::ServiceModel::EndpointAddress^ remoteAddress) :
System::ServiceModel::ClientBase<ISampleService^ >(binding, remoteAddress)
{
}
inline Service::TranceferData^ SampleServiceClient::getStatus()
{
return __super::Channel->getStatus();
}