Как MapRoute получает доступ к именам полей анонимного типа?

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

Как реализация MapRoute связывает {id} второй параметр id = с третьим?

     routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
 

Это так же просто, как размышлять о переданном объекте?

Ответ №1:

ДА.

Он создает RouteValueDictionary экземпляр из defaults параметра, который заполняется из объектов PropertyDescriptor .

Вы можете увидеть это в исходном коде:

 if (values != null) { 
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(values);
    foreach (PropertyDescriptor prop in props) { 
        object val = prop.GetValue(values);
        Add(prop.Name, val);
    }
} 
 

Комментарии:

1. где вы взяли источник, отражатель? Мне было интересно посмотреть код, который выполнял фактическое отражение — это TypeDescripter?

2. Я получил это из справочного источника для .Net 4. referencesource.microsoft.com

3. TypeDescriptor является стандартной библиотекой в System.dll . По умолчанию он использует отражение, но может выполнять другие действия через ITypedList и ICustomTypeDescriptor . (Вот как работает привязка к таблицам данных)