我写了这个函数
private string BuildXPathQuery(string prefix = "descendant::", string tag = "*", object attrs = null)
{
StringBuilder sb = new StringBuilder(prefix);
sb.Append(tag);
if (attrs != null)
foreach (var a in attrs.GetType().GetProperties())
sb.Append(string.Format("[@{0}='{1}']", a.Name, a.GetValue(attrs, null)));
return sb.ToString();
}
所以不要写
BuildXPathQuery(attrs: new Dictionary<string,string> {{"attr","value"}});
我可以写
BuildXPathQuery(attrs: new {attr=value});
但这有什么缺点吗?
答案 0 :(得分:4)
它使用的反射可能比普通类型访问慢。另一个缺点是,通过查看方法签名,您会看到一个对象,并且对于此方法的最终消费者而言,它可能并不总是很明显,因为对象可以是任何东西:
当Intellisense显示:
BuildXPathQuery(object attrs);
你真的必须在这里猜测,除非它有很好的文档记录(例如ASP.NET MVC HTML帮助程序使用类似的方法在DOM元素上构建HTML属性)。
这是一个我喜欢的Rubyist方法:-)(可选参数和哈希表)
答案 1 :(得分:0)
我认为Annonymous类型很酷,您可以根据发送的对象轻松地将其转换为适当的对象。
您可以将此匿名类型用于该方法,也可以通过反射使用它。如果您希望使用:
,也可以尝试将对象强制转换为Typevar x = attrs as new{x="", y=""};
您应该注意,编译器足够智能,可以使用现有的匿名类型,而不是为转换创建新类型。
http://www.west-wind.com/weblog/posts/189329.aspx
正如已经说过的,匿名类型更慢,所以我能看到的唯一问题是性能缓慢。但匿名对我来说很酷。