当我尝试向IDictionary提供匿名类时出错

时间:2015-09-08 21:00:50

标签: c#

我一直在关注如何对IDictionary使用匿名的问题,因为它提供了更清晰,更紧凑的代码解决方案。

Difference between anonymous class and IDictionary<string,object> for htmlAttributes in ASP.NET MVC?

当我试图测试它是如何工作的时候,我从我的编译器中得到以下错误:

(23:13) The best overloaded method match for 'Rextester.Program.test(System.Collections.Generic.IDictionary<string,string>)' has some invalid arguments
(23:18) Argument 1: cannot convert from 'AnonymousType#1' to 'System.Collections.Generic.IDictionary<object,string>'

这是我的代码:

namespace Rextester
{
  public class Program
  {        
     public static void test(IDictionary<object,string> carl){}       

     public static void Main(string[] args)
     {
        test(new{carl="Hello", carl2="World"});
     }
   }
 }

有人能告诉我我做错了什么吗?我甚至复制粘贴其他SO的代码,但我仍然继续得到同样的错误。

编译:我在学校,所以我只是使用在线编译器。

3 个答案:

答案 0 :(得分:2)

MVC不会将匿名对象转换为IDictionary。请注意,链接问题中有两种方法:

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    IDictionary<string, object> htmlAttributes);

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression,
    object htmlAttributes);

第一个方法的最后一个参数是IDictionary<string, object>,而第二个方法的最后一个参数是object。当您将匿名对象传递给TextBoxFor时,它是第二个被调用的方法,因为anonymous object可以转换为object,但不能转换为IDictionary<string, object>。然后它将使用反射来获取匿名类型上定义的属性和值。

有关如何将匿名类型转换为IDictionary<string, object>的信息,请参阅In c# convert anonymous type into key/value array?

答案 1 :(得分:1)

根据https://msdn.microsoft.com/en-us/library/bb397696.aspx: &#34;匿名类型是直接从object派生的类类型,不能转换为除object之外的任何类型。&#34;

所以我猜编译器无法将其转换为IDictionary&lt;&gt;对于方法调用,这是编译器告诉你的。

答案 2 :(得分:1)

试试这个

public static void test(IDictionary<object, string> carl)
        {


        }


        public static void Main(string[] args)
        {
            test( new Dictionary<object,string>{{"Hello", "World"}});
        }​