使用匿名类型代替字典的缺点?

时间:2010-09-26 20:26:59

标签: c# dictionary anonymous-types

我写了这个函数

    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});

但这有什么缺点吗?

2 个答案:

答案 0 :(得分:4)

它使用的反射可能比普通类型访问慢。另一个缺点是,通过查看方法签名,您会看到一个对象,并且对于此方法的最终消费者而言,它可能并不总是很明显,因为对象可以是任何东西:

当Intellisense显示:

BuildXPathQuery(object attrs);

你真的必须在这里猜测,除非它有很好的文档记录(例如ASP.NET MVC HTML帮助程序使用类似的方法在DOM元素上构建HTML属性)。

这是一个我喜欢的Rubyist方法:-)(可选参数和哈希表)

答案 1 :(得分:0)

我认为Annonymous类型很酷,您可以根据发送的对象轻松地将其转换为适当的对象。

您可以将此匿名类型用于该方法,也可以通过反射使用它。如果您希望使用:

,也可以尝试将对象强制转换为Type
var x = attrs as new{x="", y=""};

您应该注意,编译器足够智能,可以使用现有的匿名类型,而不是为转换创建新类型。

http://www.west-wind.com/weblog/posts/189329.aspx

正如已经说过的,匿名类型更慢,所以我能看到的唯一问题是性能缓慢。但匿名对我来说很酷。