首页 > 解决方案 > C# 从类对象创建 xml 文件

问题描述

我公司有 17 种付款方式。当新用户加入时,默认情况下应分配所有这 17 种类型,并应生成如下所示的 xml

数据的 XML 表示:

<User>
    <UserId>nnn</UserId>
    <UserName>cccc</UserName>
    <PaymentTypes>
        <Payment>
          <PaymentType>Payment_Type1</PaymentType>
          <PaymentTypeID>1</PaymentTypeID>
          <Setting>true</Setting>
        </Payment>
        <Payment>
          <PaymentType>Payment_Type2</PaymentType>
          <PaymentTypeID>2</PaymentTypeID>
          <Setting>true</Setting>
        </Payment>
        .
        .
        .
        <Payment>
          <PaymentType>Payment_Type17</PaymentType>
          <PaymentTypeID>17</PaymentTypeID>
          <Setting>true</Setting>
        </Payment>
    </PaymentTypes>
</User>

我创建了一个类,它将所有 xml 元素保存为此调用的数据成员和数组类型

public partial class PaymentTypes {
    
    private string paymentTypeField;
    
    private byte paymentTypeIDField;
    
    private bool settingField;
    
    /// <remarks/>
    public string PaymentType {
        get {
            return this.paymentTypeField;
        }
        set {
            this.paymentTypeField = value;
        }
    }
    
    /// <remarks/>
    public byte PaymentTypeID {
        get {
            return this.paymentTypeIDField;
        }
        set {
            this.paymentTypeIDField = value;
        }
    }
    
    /// <remarks/>
    public bool Setting {
        get {
            return this.settingField;
        }
        set {
            this.settingField = value;
        }
    }
}

private PaymentTypes[] paymentTypesField;
    
public PaymentTypes[] PaymentTypes {
    get {
        return this.paymentTypesField;
    }
    set {
        this.paymentTypesField = value;
    }
}

我能够实例化类并分配值..

PaymentTypes pt = new PaymentTypes();
pt.PaymentType = "Payment_Type1";
pt.PaymentTypeID = 1;
pt.Setting = true;

PaymentTypes pt1 = new PaymentTypes();
pt1.PaymentType = "Payment_Type2";
pt1.PaymentTypeID = 2;
pt1.Setting = true;

.
.
.

PaymentTypes pt16 = new PaymentTypes();
pt16.PaymentType = "Payment_Type17";
pt16.PaymentTypeID = 17;
pt16.Setting = true;

// Insert payment types into the array.
PaymentTypes[] paymentTypes = { pt, pt1,.....,pt16 };

//assign all 17 payment types to user object
user.PaymentTypes = paymentTypes;

通过使用 xml 序列化程序,我能够生成上述输出 xml。


上述代码的缺点:效率不高。

  1. 我已经创建了PaymentTypes17 次类的实例,具有不同的值
  2. 17 个变量来保存不同的支付类型
  3. 更多的代码行
  4. 更多的执行时间
  5. 更多的内存消耗

问题:有没有更好的方法来定义所有 17 种支付类型并以最少的代码行或简单的方法或快速的方法分配给用户对象?

标签: c#.netxml

解决方案


您可以添加一个静态 Create() 方法,该方法为 PaymentTypes 类创建一个实例,并且您可以像下面这样以合同形式重写属性。

public partial class PaymentTypes {

    public static Create(byte paymentTypeID, string paymentType, bool setting)
    {
        return new PaymentTypes 
        {
            PaymentTypeID = paymentTypeID,
            PaymentType = paymentType,
            Setting = setting
        };
    }    

    /// <remarks/>
    public string PaymentType { get; set; }

    /// <remarks/>
    public byte PaymentTypeID { get; set; }

    /// <remarks/>
    public bool Setting { get; set; }
}

然后您可以通过这种方式将付款类型分配给用户:

//assign all 17 payment types to user object
user.PaymentTypes = new PaymentTypes[] 
{
    PaymentTypes.Create(1, "Payment_Type1", true),
    PaymentTypes.Create(2, "Payment_Type2", false),
    ....
    PaymentTypes.Create(17, "Payment_Type17", true)
};

或者没有 Create() 静态方法:

//assign all 17 payment types to user object
user.PaymentTypes = new PaymentTypes[] 
{
    new PaymentTypes{ PaymentTypeID = 1, PaymentType = "PaymentType_1", Setting = true },
    new PaymentTypes{ PaymentTypeID = 2, PaymentType = "PaymentType_2", Setting = false },
    ....
    new PaymentTypes{ PaymentTypeID = 17, PaymentType = "PaymentType_17", Setting = true }
};

对于内存消耗,我在您的代码中看不到任何问题,因为实际上您需要分配 17 个 PaymentType 类的实例,并且由于这些类是引用类型,因此它们未在堆栈内存中分配。


推荐阅读