如何实现动态返回模型类的所有属性的方法?

时间:2017-08-14 10:05:38

标签: c# serialization reflection model

在我目前正在工作的项目中,我们必须调用一些需要数百个参数的外部服务。

我们为每种类型的请求都有一个模型类,类似于下面的内容(我们希望为这些参数列表提供静态类,因为数据的正确性至关重要,因此具有所有必需的字段编译时间是必须的):

public class Model1
{
     public int property1 { get; set; }
     public string property2 { get; set; }
     ...
     public string property900 { get; set; }
}

事情是,你不能简单地将它序列化为

<file>
    <property1>1</property1>
    <property2>Two</property2>
    ...
    <property900>Nine hundred</property900>
</file>

因为该服务需要它像这样

<file>
    <someConstantData>Metadata about the message</someConstantData>
    <propertyList>
        <property1>1</property1>
        <property2>Two</property2>
        ...
        <property900>Nine hundred</property900>
    </propertyList>
</file>

现在,挑战在于我们如何将模型类序列化为上述XML?在简单模型的情况下,我认为有一个接口需要所有使用它的类来实现手动返回字典的方法才能实现。 如在

return new Dictionary 
{ pr1.ToKeyValuePair(), pr2.ToKeyValuePair(),... pr10.ToKeyValuePair() }

但是在这种长模型的情况下,这是不可能的,所以我想到的另一个解决方案是在运行时创建一个Func,它使用反射GetValue()返回所有属性及其值,然后每次都返回数据在模型中需要,只需在实例上调用它。但是,我读过here使用GetValue要比对属性的标准访问慢得多,而对于我的企业应用程序,这可能意味着显着的减速。

您是否有任何其他想法可以克服这一挑战?

1 个答案:

答案 0 :(得分:0)

这对我过去有所帮助:

public override string SaveObjectToFile(string folder, string file, object o)
{
    string filename = Path.Combine(folder, string.Format("{0}{1}", file, FileExtension));
    try
    {
        using (StreamWriter writer = new StreamWriter(filename, append: false))
        {
            new XmlSerializer(o.GetType()).Serialize(writer, o);
            writer.Close();
        }
    }
    catch (Exception ex)
    {
        Trace.TraceError("Unable to serialize object " + ex.Message);
    }

    return filename;
}

这会为您输出正确的XML吗?