我正在用 C# 开发一个应用程序,它有一个在表单上声明的接口(interface):
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 控件上的一些自引用循环。转换操作不排除表单,我不知道为什么,因为我只是希望接口(interface)转换只返回接口(interface)成员。
我做错了什么?
最佳答案
在我看来,序列化代码适用于对象的实际类型,而不是作为参数传递的类型(函数甚至可能接受类型为 object
的参数,而不是通用函数 SerializeObject<T>(T obj)
的参数)似乎很正常。
如果您希望您的对象被切片,恐怕您必须自己执行切片,方法是创建一个实现该接口(interface)的对象并仅复制其成员。
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 );
关于c# - 转换为不排除表单成员的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18465167/