2010-08-27 2 views
1

Я хочу создать обобщенный вспомогательный метод загрузки и проверки 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> не соответствует свойству :(, я обойду логику setterter права . Теперь

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

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)), 

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

ответ

4

Действие не эти свойства

Если я прочитал, что правильно, вы пробовали заменить «реф индекс строки», с «Action<string>», а затем попытался прохождения Protperty. Близко, но не совсем. Как насчет?

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),  
+0

Ничего себе. Да, ты понял. Это оно! Спасибо, тон! – Squirrelsama

+1

Разве не стыдно, что вы не можете рассматривать свойства в первоклассном виде как «Action ' или 'Func ' делегаты? Определенно одна из моих самых раздражающих точек прилипания к C#. – mquander

+0

Я больше не мог согласиться. Я понимаю, почему - C# должен был бы сделать слишком много о параметре (будь то Action или Func ) для того, как статически типизирован C#. Но все же ... Мы должны просить Microsoft изменить это! : D – Squirrelsama

1

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

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

Смежные вопросы