Передача свойств в качестве параметров - PullRequest
1 голос
/ 27 августа 2010

Я хочу создать обобщенный вспомогательный метод для загрузки и проверки LoadFromXML. Если XML-файл, с которого я загружаю, является неполным, я хочу, чтобы он полностью завершился сбоем без исключения. В настоящее время мой код выглядит так (более или менее)

public override bool Load(XElement source)
{
    return new List<Func<XElement, bool>>
    {
        i => this.LoadHelper(i.Element(User.XML_Username), ref this._username, User.Failure_Username),
        i => this.LoadHelper(i.Element(User.XML_Password), ref this._password, User.Failure_Password)
        //there are many more invokations of LoadHelper to justify this architecture
    }
    .AsParallel()
    .All(i => i.Invoke(source));
}

private bool LoadHelper(XElement k, ref string index, string failure)
{
    if (k != null && k.Value != failure)
    {
        index = k.Value;
        return true;
    }
    return false;
}

this._username - это закрытая переменная-член, которая используется свойством this.Username. Это текущее решение, которое у меня есть для этой проблемы, но я столкнулся с одной большой проблемой: так как я не могу передать само свойство в LoadHelper, а Action<string> не соответствует свойству :(, я обхожу логика установки свойств прямо сейчас.

По вашим собственным соображениям, до абстракции LoadHelper каждая из моих записей List<Func<XElement, bool>> выглядела так ...

i => ((Func<XElement, bool>)(k => { if (k == null || k.Value == User.Failure_Username) return false; 
                    { this.Username = k.Value; return true; } })).Invoke(i.Element(User.XML_Username)),

Вопрос: Кто-нибудь знает способ сделать это, не обходя логику установщика свойства?

Ответы [ 2 ]

5 голосов
/ 27 августа 2010

Действие не соответствует свойству

Если я правильно прочитал, вы попытались заменить "ref string index" на "Action<string>"а затем попытался передать имущество.Близко, но не совсем.Как дела?

private bool LoadHelper(XElement k, Action<string> setter, string failure) 
{ 
    if (k != null && k.Value != failure) 
    { 
        setter(k.Value); 
        return true; 
    } 
    return false; 
} 

тогда

  i => this.LoadHelper(i.Element(User.XML_Username), s=>{this.Username = s},
                          User.Failure_Username),     
1 голос
/ 28 августа 2010

Я иногда задавался вопросом, как много будет раздуто для того, чтобы .Net поддерживал интерфейс iProperty (из T) с двумя членами, Get и Set, и автоматически переносил поля и свойства, чтобы параметр iProperty (из T) мог передать поле или свойство.

Используя анонимные методы, можно создать такую ​​вещь не слишком ужасно, создав класс xProperty, конструктор которого использовал методы, необходимые для получения и установки свойства. Можно определить экземпляры класса для любых свойств, которыми другие классы могут манипулировать напрямую. Однако все было бы намного лучше, если бы существовал стандартный интерфейс. К сожалению, я не знаю ни одного существующего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...