将属性作为参数传递

时间:2010-08-27 19:39:10

标签: c# parameters lambda properties parallel-processing

我想为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>与属性不匹配:(,I现在正在绕开财产制定者的逻辑。

对于你自己的思考,在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 个答案:

答案 0 :(得分:5)

  
    

动作与属性

不匹配   

如果我读得正确,你试图用“Action<string>”替换“ref string index”,然后尝试传递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),     

答案 1 :(得分:1)

我有时想知道.Net支持一个带有两个成员的GetPer接口的iProperty(T)接口,并自动包装字段和属性,以便iProperty(T)参数能够膨胀。通过一个领域或财产。

使用匿名方法,可以通过创建一个xProperty类来创建这样的东西,这个类的构造函数采用了获取和设置属性所需的方法。可以为任何希望其他类能够直接操作的属性定义类的实例。但是,如果有标准接口,事情就会好得多。不幸的是,我不知道现有的一个。