如何从静态方法返回值创建 C# 类实例?

发布于 2024-11-16 03:04:44 字数 445 浏览 1 评论 0原文

我尝试使用 XDocument (XML Linq) 来保存和加载类。为此,我有两种方法:

static MyClass FromXml(XElement data); //calls 0-parameter constructor inside
public XElement ToXml();

像这样的构造函数

public MyClass(XElement data)
{
    this = MyClass.FromXml(data);
}

不起作用(说这是只读的)。 这可以以某种方式完成(无需从返回值手动复制每个字段)吗?
或者这个想法本身就是错误的?
将代码从 FromXml 移动到构造函数应该可以工作,但是保存和加载将在两个位置,或者构造函数不会全部集中在一个位置......

I try to use XDocument (XML Linq) to save and load classes. For this I have two methods:

static MyClass FromXml(XElement data); //calls 0-parameter constructor inside
public XElement ToXml();

A constructor like this

public MyClass(XElement data)
{
    this = MyClass.FromXml(data);
}

does not work (says this is read only).
Can this be done somehow (without creating copying each field manually from the returned value)?
Or is the very idea wrong?
Moving the code from FromXml to constructor should work, but then saving and loading would be in two places or constructors would not be all in one place...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

路弥 2024-11-23 03:04:44

我认为你不需要一个构造函数;您需要一个返回 MyClass 类型的静态工厂方法。看来您已经使用 FromXml 方法实现了该功能。您始终可以编写复制构造函数如果你真的想要的话,它会接受 MyClass 的另一个实例。

I don't think you want a constructor; you want a static factory method that returns type MyClass. It looks like you already have that with method FromXml. You could always write a copy constructor that takes in another instance of MyClass if you really wanted.

2024-11-23 03:04:44

我想你会需要这样的东西:

public class MyClass
{
    public MyClass() {}
    public MyClass(XElement data)
    {
        loadXml(this, data);    
    }
    public static MyClass LoadXml(data)
    {
        var output = new MyClass();
        loadXml(output, data);
        return output;
    }
    private static void loadXml(MyClass classToInitialize, XElement data)
    {
        // your loading code goes here
    }
}

I think you would need something like this:

public class MyClass
{
    public MyClass() {}
    public MyClass(XElement data)
    {
        loadXml(this, data);    
    }
    public static MyClass LoadXml(data)
    {
        var output = new MyClass();
        loadXml(output, data);
        return output;
    }
    private static void loadXml(MyClass classToInitialize, XElement data)
    {
        // your loading code goes here
    }
}
演多会厌 2024-11-23 03:04:44

您可以创建一个非公共方法 static MyClass FromXml(XElement data, MyClass instance),它使用 data 填充传入的实例。然后,您可以从构造函数调用它,并将 this 作为参数传递。

You could create a non-public method static MyClass FromXml(XElement data, MyClass instance) which fills the passed-in instance using data. You can then call that from the constructor, passing this as an argument.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文