我一直在关注如何对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的代码,但我仍然继续得到同样的错误。
编译:我在学校,所以我只是使用在线编译器。
答案 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"}});
}