将属性作为参数传递
问题描述:
我想为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)),
问题:没有人知道任何方式做到这一点不回避属性的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),
答
我有时倒会是多少臃肿的东西对于.NET支持(T)的一个接口的iProperty有两个成员,获取和设置,并自动包装领域和属性,以便一个iProperty(的T)参数可以传递一个字段或属性。
使用匿名方法,人们可以通过创建一个xProperty类创建一个xProperty类,该类的构造函数使用获取和设置属性所必需的方法,从而不会造成太大的负面影响。人们可以为任何想让其他类可以直接操作的属性定义类的实例。如果有一个标准的界面,事情会更好。不幸的是,我不知道现有的一个。
哇。是的,你知道了。就是这个!谢谢你的伴侣! – Squirrelsama 2010-08-27 19:51:56
难道你不能以一流的方式将属性视为“行动”或“功能”代表?绝对是我关于C#最令人恼怒的一点。 –
mquander
2010-08-27 19:55:35
我完全同意。我明白为什么 - C#将不得不推断有关参数(无论是动作还是函数)对于静态类型化C#的过程。但仍......我们应该请微软改变这一点! :d –
Squirrelsama
2010-08-27 19:57:47