Asp.net mvc 3 ASP.NET MVC框架中的匿名类型参数

Asp.net mvc 3 ASP.NET MVC框架中的匿名类型参数,asp.net-mvc-3,Asp.net Mvc 3,有谁能解释ASP.NET MVC framework如何从匿名类型参数中检索值,例如Html.ActionLink,其中表示Html属性的参数可以作为匿名类型传入。我读到它在内部使用反射。我正在寻找更好理解的伪代码或示例。它使用了宝贵的构造函数,允许您将匿名对象转换为字典: class Program { static void Main() { var anon = new { foo = "foo value", bar = "bar value" };

有谁能解释ASP.NET MVC framework如何从匿名类型参数中检索值,例如
Html.ActionLink
,其中表示Html属性的参数可以作为匿名类型传入。我读到它在内部使用反射。我正在寻找更好理解的伪代码或示例。

它使用了宝贵的构造函数,允许您将匿名对象转换为字典:

class Program
{
    static void Main()
    {
        var anon = new { foo = "foo value", bar = "bar value" };
        IDictionary<string, object> values = new RouteValueDictionary(anon);
        foreach (var item in values)
        {
            Console.WriteLine("{0}, {1}", item.Key, item.Value);
        }
    }
}
类程序
{
静态void Main()
{
var anon=new{foo=“foo value”,bar=“bar value”};
IDictionary值=新的RouteValueDictionary(anon);
foreach(值中的var项)
{
WriteLine(“{0},{1}”,item.Key,item.Value);
}
}
}
就实现而言,您可以随时查看ASP.NET MVC源代码,但以下是相关部分:

public class RouteValueDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable
{

    public RouteValueDictionary(object values)
    {
        this._dictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        this.AddValues(values);
    }

    private void AddValues(object values)
    {
        if (values != null)
        {
            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(values))
            {
                object obj2 = descriptor.GetValue(values);
                this.Add(descriptor.Name, obj2);
            }
        }
    }

    ...
}
公共类RouteValueDictionary:IDictionary、ICollection、IEnumerable、IEnumerable
{
公共RouteValueDictionary(对象值)
{
this.\u dictionary=新字典(StringComparer.OrdinalIgnoreCase);
这是AddValues(值);
}
私有void AddValues(对象值)
{
如果(值!=null)
{
foreach(TypeDescriptor.GetProperties(值)中的PropertyDescriptor描述符)
{
object obj2=descriptor.GetValue(值);
this.Add(descriptor.Name,obj2);
}
}
}
...
}
正如您所见,它使用
TypeDescriptor.GetProperties
方法检索匿名对象的所有属性及其值。

您可以通过MVC亲自查看