c# - 转换为不排除表单成员的接口(interface)

标签 c# json interface casting

我正在用 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/

相关文章:

json - 使用 jq 生成字段值频率计数

javascript - 如何清除 JSON 的缓存

javascript - 将具有 key=value 对的字符串解析为 JSON

java - 使用 String name() 声明实现 Java 接口(interface)的 Kotlin 枚举

java - 在不实例化(未知)具体类型的情况下从方法返回接口(interface)对象

c# - Entity Framework 检查数据库表是否添加了新记录

c# - 在 Coldfusion 中加密并在 C# 中解密

c# - 正则表达式值更新

c# - 无法获取 div_images 的内部内容,因为内容不是文字

java - 从接口(interface)中的默认方法中访问 super 方法