Zac*_*ith 2 c# wcf constructor
有人告诉我,包含getter和setter的可序列化对象需要一个空白构造函数,如下所示:
[DataContract]
public class Item
{
[DataMember]
public string description { get; set; }
public Item() {}
public Item(string description)
{
this.description = description;
}
}
Run Code Online (Sandbox Code Playgroud)
并且告诉我的原因是这允许使用setter构造对象.但是,我发现Item定义如下:
[DataContract]
public class Item
{
[DataMember]
public string description { get; set; }
public Item(string description)
{
this.description = description;
}
}
Run Code Online (Sandbox Code Playgroud)
当通过WCF服务引用作为代理类提供时,可以在不调用构造函数的情况下构造:
Item item = new Item {description = "Some description"};
Run Code Online (Sandbox Code Playgroud)
问题:
new
Item我发现如果类不是代理类,我不能在没有构造函数的情况下创建对象.
我正在编写的代码块究竟是什么?
Item item = new Item {description = "Some description"};
Run Code Online (Sandbox Code Playgroud)
是相同的,并编译为:
Item item = new Item();
item.description = "Some description";
Run Code Online (Sandbox Code Playgroud)
所以它需要一个无参数的构造函数.如果该类没有,但具有参数化类,则必须使用该类:
Item item = new Item("Some description");
Run Code Online (Sandbox Code Playgroud)
使用命名参数,它看起来像这样:
Item item = new Item(description: "Some description");
Run Code Online (Sandbox Code Playgroud)
您仍然可以将其与对象初始化程序语法结合使用:
var item = new Item("Some description")
{
Foo = "bar"
};
Run Code Online (Sandbox Code Playgroud)
[DataContract]类是否需要空白构造函数?
是.默认的序列化程序DataContractSerializer 不使用反射来实例化新实例,但仍需要无参数构造函数.
如果找不到无参数构造函数,则无法实例化该对象.嗯,它可以,但事实并非如此.因此,如果您要Item在服务操作中实际使用此类:
public void SomeOperation(Item item)
{
}
Run Code Online (Sandbox Code Playgroud)
一旦从客户端调用此操作,WCF将抛出异常,因为序列化程序无法找到无参数构造函数Item.