代码之家  ›  专栏  ›  技术社区  ›  Squirrelsama

将属性作为参数传递

  •  1
  • Squirrelsama  · 技术社区  · 14 年前

    我想为LoadFromXML加载和验证创建一个通用的helper方法。如果从中加载的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>

    为了你自己的思考,在 抽象,我的每一个 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 回复  |  直到 14 年前
        1
  •  6
  •   James Curran    14 年前

    操作与属性不匹配

    如果我没看错的话,你试着用 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),     
    
        2
  •  1
  •   supercat    14 年前

    我有时想知道,如果.Net支持具有两个成员(Get和Set)的iProperty(of T)接口,并自动包装字段和属性,以便iProperty(of T)参数可以传递给字段或属性,那会有多大影响。

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