如何将当前类设置为返回类型结果 [英] how do I set the current class to the return types results

查看:92
本文介绍了如何将当前类设置为返回类型结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个课

using System.IO;
using System.Xml.Serialization;

    namespace ssscc.Settings
    {
      public class AppSettings
      {
        private string _companyName;
        public string CompanyName
        {
          set { _companyName = value; }
          get
          {
            if (string.IsNullOrWhiteSpace(_companyName))
            {
              LoadSettings();
            }
            return _companyName;
          }
        }

        private string _companyPhone;
        public string CompanyPhone
        {
          set
          {

            _companyPhone = value;
          }
          get
          {
            if (string.IsNullOrWhiteSpace(_companyPhone))
            {
              LoadSettings();
            }
            return _companyPhone;
          }
        }

        private string GetSettingsFile()
        {
          var exePath = System.Windows.Forms.Application.StartupPath;
          var sharedDirectory = Path.Combine(exePath, "shared");
          var settingsDirectory = Path.Combine(sharedDirectory, "settings");
          var settingsFile = Path.Combine(settingsDirectory, "ssscc.xml");

          if (!Directory.Exists(sharedDirectory))
          {
            Directory.CreateDirectory(sharedDirectory);
          }

          if (!Directory.Exists(settingsDirectory))
          {
            Directory.CreateDirectory(settingsDirectory);
          }

          return settingsFile;
        }

        internal void SaveSettings(AppSettings settings)
        {
          var serializer = new XmlSerializer(typeof(AppSettings));
          using (var stream = File.OpenWrite(GetSettingsFile()))
          {
            serializer.Serialize((Stream) stream, (object) settings);
          }
        }

        internal void LoadSettings()
        {
          if (!File.Exists(GetSettingsFile()))
          {
            return;
          }

          var serializer = new XmlSerializer(typeof(AppSettings));
          using (var stream = File.OpenRead(GetSettingsFile()))
          {
            var appsetting = (AppSettings) serializer.Deserialize(stream);
            CompanyPhone = appsetting.CompanyPhone;
            CompanyName = appsetting.CompanyName;
          }
        }

      }
    }

我的问题是关于此代码的:

My question is about this code:

   var appsetting = (AppSettings) serializer.Deserialize(stream);
    CompanyPhone = appsetting.CompanyPhone;
    CompanyName = appsetting.CompanyName;

我很确定有一种方法可以将appsettings直接返回到包含方法的类中,因此我不必遍历这样的每个属性:

I am pretty sure there is a way to return the appsettings directly to the class that contains the method so I do not have to loop through each property such as this:

    CompanyPhone = appsetting.CompanyPhone;
    CompanyName = appsetting.CompanyName;

我可以直接分配属性而无需维护此代码吗?

Can I assign the properties directly without having to maintain this code?

推荐答案

从文件中反序列化时,您将获得 AppSettings 的新实例。您可以使用它,对吗?尝试用如下的静态工厂方法替换 LoadSettings

You are getting a new instance of AppSettings while deserializing from file. You may use it, can't you? Try to replace LoadSettings with a static factory method like this:

internal static AppSettings GetInstance()
{
    if (!File.Exists(GetSettingsFile()))
        return null;

    var serializer = new XmlSerializer(typeof(AppSettings));
    using (var stream = File.OpenRead(GetSettingsFile()))
        return (AppSettings)serializer.Deserialize(stream);
}

在保存设置的同时,您无需将设置对象传递为一个争论。我猜下面的代码应该可以完成这项工作:

while to save your settings, you have no need to pass the settings object as an argument. I guess the following code should do the job:

internal void SaveSettings()
{
    var serializer = new XmlSerializer(typeof(AppSettings));
    using (var stream = File.OpenWrite(GetSettingsFile()))
        serializer.Serialize((Stream)stream, this);
}

使用工厂 GetInstance 初始化设置的方法(例如):

Use the factory GetInstance method to initialize settings (well, as an example):

var s = AppSettings.GetInstance();
if (s == null)
{
    s = new AppSettings
    {
        CompanyName = "MyCompany",
        CompanyPhone = "######"
    };
    s.SaveSettings();
}

PS:如果属性获取器和设置器没有其他逻辑( LoadSettings 方法已不存在),则可以使用自动属性:

P.S.: if properties getters and setters have no additional logic (LoadSettings method no longer exists), you could use auto-properties:

public string CompanyName { get; set; }

public string CompanyPhone { get; set; }

GetSettingsFile 可以声明为 static ,因为它不操作任何实例类成员:

and GetSettingsFile may be declared as static, as it does not operate any of the instance class members:

private static string GetSettingsFile()
{
    //...
    return settingsFile;
}

这篇关于如何将当前类设置为返回类型结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆