2013-08-27 33 views
4

我开发在C#中,有一个表格上声明的接口的应用程序:演员接口不排除形式成员

public partial class frmProjectForm : Form, IProjectInfo 
{ 

} 

public interface IProjectInfo 
{ 
    string ProjectName { get; set; } 
    string ProjectTitle { get; set; } 
    string ProjectDescription { get; set; } 
    string ProjectAuthor { get; set; } 
    string ProjectCopyright { get; set; } 
    string ProjectTrademark { get; set; } 
    string ProjectCreationDate { get; set; } 
    string ProjectVersion { get; set; } 
    string ProjectFileName { get; } 
    string ProjectFilePath { get; } 
    string FullProjectPath { get; } 
} 

某处在应用程序,我想这样做:

frmProjectForm f = new frmProjectForm(); 
f.ShowDialog(this); 
... 
... 
IProjectInfo getProjectInfoMembersOnly = (IProjectInfo)f; 

// persist the IProjectInfo members to JSON 
string project = JsonConvert.SerializeObject(getProjectInfoMembersOnly); 

JsonConvert.SerializeObject方法正在炸毁并抱怨Button控件上的某些自我引用循环。铸造操作不排除窗体,我不知道为什么,因为我只是想接口转换只返回接口成员。

我在做什么错?

+0

我不太清楚,但我想只是投实例的界面不会隐藏实例属性序列化时...你还在序列化实例 – derape

+1

你为什么要继承一个形式,如果你只需要在界面属性? – AMember

+0

@AMember我实际上并没有继承一个表单 - 它是一个继承了一个接口的表单。我想创建一个标准化表单,我可以使用'IProjectInfo'接口作为方法参数,而不是指定具体的表单实例。 – Intrepid

回答

1

看来正常的,我认为一个序列化代码将在对象的实际类型的工作,而不是作为参数传递的类型(它甚至可能是函数接受object类型的参数,而不是一个泛型函数SerializeObject<T>(T obj))。

如果你想让你的对象成为切片,恐怕你必须自己执行切片,方法是创建一个实现该接口的对象并仅复制其成员。

public class ProjectInfo : IProjectInfo 
{ 
    public string ProjectName { get; set; } 
    public string ProjectTitle { get; set; } 
    public string ProjectDescription { get; set; } 
    public string ProjectAuthor { get; set; } 
    public string ProjectCopyright { get; set; } 
    public string ProjectTrademark { get; set; } 
    public string ProjectCreationDate { get; set; } 
    public string ProjectVersion { get; set; } 
    public string ProjectFileName { get; private set; } 
    public string ProjectFilePath { get; private set; } 
    public string FullProjectPath { get; private set; } 

    public ProjectInfo(IProjectInfo src) 
    { 
     this.ProjectName = src.ProjectName; 
     this.ProjectTitle = src.ProjectTitle; 
     this.ProjectDescription = src.ProjectDescription; 
     this.ProjectAuthor = src.ProjectAuthor; 
     this.ProjectCopyright = src.ProjectCopyright; 
     this.ProjectTrademark = src.ProjectTrademark; 
     this.ProjectCreationDate = src.ProjectCreationDate; 
     this.ProjectVersion = src.ProjectVersion; 
     this.ProjectFileName = src.ProjectFileName; 
     this.ProjectFilePath = src.ProjectFilePath; 
     this.FullProjectPath = src.FullProjectPath; 
    } 
} 

然后你就可以使用这种方式:

frmProjectForm f = new frmProjectForm(); 
f.ShowDialog(this); 
... 
... 
IProjectInfo getProjectInfoMembersOnly = new ProjectInfo(f); //I only changed this line 

// persist the IProjectInfo members to JSON 
string project = JsonConvert.SerializeObject(getProjectInfoMembersOnly); 
+0

我认为这是一个很好的解决方案。我已经有了一个继承'IProjectInfo'的具体类,所以我将在你的切片建议中使用它。 – Intrepid

+0

但看到@tandrewnichols的回答后,我认为它比我的好得多。 – Medinoc

1

如果你只使用了序列化接口(从你的问题不清楚),你并不需要一个接口都没有。 JSON.NET提供了标记哪些字段应该被序列化的属性。即使您正在使用的接口别的东西,没有任何理由,你不能像这样定义类:

// Use optin so you don't have to worry about fields generated by the designer. 
[JsonObject(MemberSerialization.OptIn)] 
public partial class frmProjectForm : Form 
{ 
    [JsonProperty] 
    public string ProjectName { get; set; } 
    [JsonProperty] 
    public string ProjectTitle { get; set; } 
    [JsonProperty] 
    public string ProjectDescription { get; set; } 
    [JsonProperty] 
    public string ProjectAuthor { get; set; } 
    [JsonProperty] 
    public string ProjectCopyright { get; set; } 
    [JsonProperty] 
    public string ProjectTrademark { get; set; } 
    [JsonProperty] 
    public string ProjectCreationDate { get; set; } 
    [JsonProperty] 
    public string ProjectVersion { get; set; } 
    [JsonProperty] 
    public string ProjectFileName { get; } 
    [JsonProperty] 
    public string ProjectFilePath { get; } 
    [JsonProperty] 
    public string FullProjectPath { get; } 

    // . . . Other properties, buttons, and form fields 
} 

然后,当你调用JSONConvert.SerializeObject(),只有场标记为JsonProperty将被序列化。