2013-08-27 30 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將被序列化。