Вырубка повторяющегося кода в c # Class - PullRequest
3 голосов
/ 19 марта 2011

Это оболочка для API, над которым я работаю, правильно ли я это делаю? Я не особенно люблю весь повторяющийся код в конструкторе, если кто-то может показать мне, если я могу уменьшить, это будет очень полезно!

public class WebWizForumVersion
{
    // Properties of returned data
    public string Software { get; private set; }
    public string Version { get; private set; }
    public string APIVersion { get; private set; }
    public string Copyright { get; private set; }
    public string BoardName { get; private set; }
    public string URL { get; private set; }
    public string Email { get; private set; }
    public string Database { get; private set; }
    public string InstallationID { get; private set; }
    public bool NewsPad { get; private set; }
    public string NewsPadURL { get; private set; }

    public WebWizForumVersion(XmlReader Data)
    {
        try
        {
            Data.ReadToFollowing("Software");
            this.Software = Data.ReadElementContentAsString();
            Data.ReadToFollowing("Version");
            this.Version = Data.ReadElementContentAsString();
            Data.ReadToFollowing("ApiVersion");
            this.APIVersion = Data.ReadElementContentAsString();
            Data.ReadToFollowing("Copyright");
            this.Copyright = Data.ReadElementContentAsString();
            Data.ReadToFollowing("BoardName");
            this.BoardName = Data.ReadElementContentAsString();
            Data.ReadToFollowing("URL");
            this.URL = Data.ReadElementContentAsString();
            Data.ReadToFollowing("Email");
            this.Email = Data.ReadElementContentAsString();
            Data.ReadToFollowing("Database");
            this.Database = Data.ReadElementContentAsString();
            Data.ReadToFollowing("InstallID");
            this.InstallationID = Data.ReadElementContentAsString();
            Data.ReadToFollowing("NewsPad");
            this.NewsPad = bool.Parse(Data.ReadElementContentAsString());
            Data.ReadToFollowing("NewsPadURL");
            this.NewsPadURL = Data.ReadElementContentAsString();
        }
        catch (Exception e)
        {

        }
    }
}

Ответы [ 5 ]

4 голосов
/ 19 марта 2011

Я бы оставил присвоение ваших локальных свойств в покое и использовал бы вспомогательные методы для чтения значений из XML.

public class WebWizForumVersion
{
    public WebWizForumVersion(XmlReader Data)
    {
        this.Software = Data.ReadString("Software");
        this.Version = Data.ReadString("Version");
        this.APIVersion = Data.ReadString("ApiVersion");
        this.NewsPad = Data.ReadBool("NewsPad");
    }
}

public static class XmlReaderHelpers
{
    private string ReadString(this XmlReader Data, string name)
    {
        Data.ReadToFollowing(name);
        return Data.ReadElementContentAsString();
    }

    private bool ReadBool(this XmlReader Data, string name)
    {
        return bool.Parse(Data.ReadString(name));
    }
}
4 голосов
/ 19 марта 2011
var properties = new [] {
    new {Name = "Software", Setter = new Action<string>(value => this.Software = value)},
    new {Name = "Version", Setter = new Action<string>(value => this.Version= value)},
    new {Name = "ApiVersion", Setter = new Action<string>(value => this.ApiVersion = value)},
    // ...
    new {Name = "NewsPad", Setter = new Action<string>(value => this.NewsPad = bool.Parse(value))},
}

foreach (var property in properties)
{
    Data.ReadToFollowing(property.Name);
    property.Setter(Data.ReadElementContentAsString());
}
1 голос
/ 19 марта 2011

Можно ли вместо этого иметь все свои значения в объекте типа «Словарь»? Так что-то вроде этого упростит вещи:

public Dictionary<string, string> ForumVars = null;

public WebWizForumVersion(XmlReader Data)
{
    ForumVars = new Dictionary<string, string>();
    ForumVars.Add("Software", GetValue("Software"));
    ForumVars.Add("Version", GetValue("Version"));
    ForumVars.Add("APIVersion", GetValue("APIVersion"));
}

protected string GetValue(string key)
{
    Data.ReadToFollowing(key);
    return Data.ReadElementContentAsString();
}

Я понимаю, что не все может быть строкой (например, NewsPad), поэтому вы можете вместо этого работать с динамическим или Object.

0 голосов
/ 19 марта 2011

ЕСЛИ вы можете изменить имя вашего InstallationID свойства на InstallID в соответствии с именем элемента, тогда вы можете использовать refelction:

public class WebWizForumVersion
{
    // Properties of returned data
    public string Software { get; private set; }
    public string Version { get; private set; }
    public string APIVersion { get; private set; }
    public string Copyright { get; private set; }
    public string BoardName { get; private set; }
    public string URL { get; private set; }
    public string Email { get; private set; }
    public string Database { get; private set; }
    public string InstallID { get; private set; }  // changed property name
    public bool NewsPad { get; private set; }
    public string NewsPadURL { get; private set; }

    public WebWizForumVersion( XmlReader Data )
    {
        try
        {
            PropertyInfo[] props = this.GetType().GetProperties();

            foreach( PropertyInfo pi in props )
            {
                Data.ReadToFollowing( pi.Name );
                if( pi.PropertyType == typeof( bool ) )
                {
                    pi.SetValue( this, bool.Parse( Data.ReadElementContentAsString() ), null );
                }
                else
                {
                    pi.SetValue( this, Data.ReadElementContentAsString(), null );
                }
            }
        }
        catch( Exception e )
        {
          // do something with exception
        }
    }
}
0 голосов
/ 19 марта 2011

Да, и при использовании словаря способ еще более упростить его выглядит следующим образом.

new Dictionary<string, string>() {
    {"key", "val"},
    ...
}
...