将属性作为参数传递

问题描述:

我想为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一个私有成员变量。这是目前我对这个问题的解决方案,但我面临的一个主要问题:因为我不能通过属性本身到LoadHelperAction<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)), 

问题:没有人知道任何方式做到这一点不回避属性的setter logic?

如果我没有看错,你试图取代“裁判串指数”,以“ 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 2010-08-27 19:51:56

+1

难道你不能以一流的方式将属性视为“行动”或“功能”代表?绝对是我关于C#最令人恼怒的一点。 – mquander 2010-08-27 19:55:35

+0

我完全同意。我明白为什么 - C#将不得不推断有关参数(无论是动作还是函数)对于静态类型化C#的过程。但仍......我们应该请微软改变这一点! :d – Squirrelsama 2010-08-27 19:57:47

我有时倒会是多少臃肿的东西对于.NET支持(T)的一个接口的iProperty有两个成员,获取和设置,并自动包装领域和属性,以便一个iProperty(的T)参数可以传递一个字段或属性。

使用匿名方法,人们可以通过创建一个xProperty类创建一个xProperty类,该类的构造函数使用获取和设置属性所必需的方法,从而不会造成太大的负面影响。人们可以为任何想让其他类可以直接操作的属性定义类的实例。如果有一个标准的界面,事情会更好。不幸的是,我不知道现有的一个。