У меня есть следующий класс контракта данных для моего Сервиса WCF:
[DataContract(Name = "MyClassDTO")]
public class MyClass
{
private string name = "Default Name";
[DataMember]
public string Name
{
get { return name; }
set { name = value; }
}
}
То, когда я использую Visual Studio, Добавляют, что Сервисная Ссылочная функция для генерации Сервиса WCF Ссылается на сгенерированный DataContract, выглядит примерно так:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name = "MyClassDTO", Namespace = "xxx")]
[System.SerializableAttribute()]
public partial class MyClassDTO : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged
{
[System.Runtime.Serialization.OptionalFieldAttribute()]
private string NameField;
[System.Runtime.Serialization.DataMemberAttribute()]
public string Name
{
get
{
return this.NameField;
}
set
{
if ((object.ReferenceEquals(this.NameField, value) != true))
{
this.NameField = value;
this.RaisePropertyChanged("Name");
}
}
}
}
Это означает, значение по умолчанию "Имя по умолчанию" теряется, и после поведения происходит:
MyClassDTO mcdto = new MyClassDTO();
serviceClient.DoSomething(mcdto);
[OperationContract]
void DoSomething(MyClass mc){
mc.Name //<-- == null but I want it to be "Default Name"
}
Существует ли путь, настраивают контракт данных тот путь, что определенное значение по умолчанию "Имя по умолчанию" не теряется?
дополнительная информация: Я использую сервисную ссылку без повторного использования типов в блоках, на которые ссылаются, например, на стороне клиента класс, MyClassDTO сгенерирован не знающий о серверном классе MyClass
Единственное возможное (но уродливое и поэтому не очень удовлетворяющее) решение, которое я нашел на данный момент, это использование атрибута OnDeserializing
для установки значений по умолчанию в начале десериализации и использование сеттера поля для определения того, должно ли передаваемое значение быть установлено на самом деле.
[DataContract(Name = "MyClassDTO")]
public class MyClass
{
private string name;
public MyClass()
{
Init();
}
[DataMember]
public string Name
{
get{ return name; }
set
{
if (!String.IsNullOrEmpty(value))
{
name = value;
}
}
}
private void Init()
{
name = "Default Name";
}
[System.Runtime.Serialization.OnDeserializing]
private void OnDeserializing(StreamingContext ctx)
{
Init();
}
}
Я не верю, что XML-схема позволяет описать значение по умолчанию элемента. Это означает, что, если клиент вашего обслуживания обеспокоен, там нет значения по умолчанию.
Кроме того, вы ничего не сделали, чтобы сказать WCF, что вы хотите иметь значение по умолчанию, поэтому, даже если бы был способ сообщить о своем намерении клиенту, тот факт, что вы не сообщаете о своем намерении.
Хммм... Я думал, что с [DefaultValue(. ...)]
, что сработало бы, но, видимо, нет; однако, я немного запутался, почему вы получаете null
, так как вы не сказали об этом ни о каком значении по умолчанию, я ожидал, что "Default Name"
попадет в выходной файл. Если у вас есть код по умолчанию (или ShouldSerialize*
/ *Specified
), то вы можете попробовать:
[DataMember(EmitDefaultValue=true)]
public string Name {
get { return name; }
set { name = value; }
}
Но опять же - я не совсем понимаю, почему вы видите null
в первую очередь.
Я только что протестировал это с чем-то, основанным на WCF шаблоне в VS2008, и он работает отлично:
using (var client = new Service1Client()) {
var result = client.GetDataUsingDataContract();
Console.Write(result.Name); // "Default Name"
}
Старая запись, но кому-то она может понадобиться, как и мне;)
if (strlen($str) == 0){
do what ever
}
замените $ str
вашей переменной.
NULL
и «»
возвращают 0 при использовании strlen
.
Dim arrText() As String
Dim lineThreeHundred As String
arrText = File.ReadAllLines("c:\test.txt")
lineThreeHundred = arrText(299)
Edit: C # Version
string[] arrText;
string lineThreeHundred;
arrText = File.ReadAllLines("c:\test.txt");
lineThreeHundred = arrText[299];
-121--4121253- Во время десериализации будет выполнена логика «set» вашего свойства, поэтому вы можете проверить значение NULL и установить значение по умолчанию, которое вы хотите использовать в этот пункт.