Поиск источника анонимного типа - PullRequest
1 голос
/ 09 сентября 2010

У меня есть метод отражения, который находит все типы в пространстве имен:

        var models =
            Assembly.GetAssembly(application).GetTypes().Where(
                @t => @t.Namespace == typeof(ViewModelNamespaceBeacon).Namespace).OrderBy(@m => @m.Name).ToList();

Моя проблема в том, что я возвращаю анонимный тип с именем: {Name = "<> c__DisplayClass2" FullName = "UCHC.CFAR.Web.Models.FieldSecurityViewModel + <> c__DisplayClass2"}

Теперь из того, что я видел, обнаружение анонимных типов затруднительно ( 1141874 ), но я всегда могу отфильтровать "прикольные" имена, т.е. ,

Я просто пытаюсь найти этот анонимный тип, чтобы я мог его реорганизовать. Пространство имен, которое я проверяю, является моим пространством имен ViewModel и не должно содержать слишком много логики. Теперь, учитывая, что я только что сказал, что у меня есть один ViewModel, который выполняет некоторую логику (это средний рефакторинг пары других вспомогательных классов) и, кажется, идентифицируется по имени в имени моего анонимного типа:

public List<string> Roles { get; private set; }
    public IEnumerable<SelectListItem> ViewModelSelectList { get; private set; }

    public List<SecurityRule> SecurityRules { get; set; }
    public Type SelectedViewModel { get; set; }

    public FieldSecurityViewModel(IEnumerable<string> roles, 
                                  IEnumerable<Type> viewModels, 
                                  string selectedViewModelName = ""
        )
    {
        SetFilteredRoles(roles);

        SetViewModelSelectList(viewModels, selectedViewModelName);
    }

    private void SetViewModelSelectList(IEnumerable<Type> viewModels, string selectedViewModelName)
    {
        ViewModelSelectList = from v in viewModels
                              select new SelectListItem()
                                         {
                                             Selected = v.Name == selectedViewModelName,
                                             Text = GenerateFriendlyViewModelName(v.Name),
                                             Value = v.Name
                                         };
        return;
    }

    private void SetFilteredRoles(IEnumerable<string> roles)
    {
        Roles =  roles.Where(@a => !@a.EndsWith("Admin") && !@a.EndsWith("NonFacultyUsers") && @a.StartsWith("CFAR.")).ToList();
    }

    public static string GenerateFriendlyViewModelName(string typeName)
    {
        var result = typeName.Replace("ViewModel", "")
            .Replace("GridViewModel", "")
            .Replace("EditViewModel", "")
            .Replace("GridModel", "");

        return result.HumanizeCamel();
    }

    public IEnumerable<ModelMetadata> GetProperties()
    {
        if (SelectedViewModel == null)
            return new List<ModelMetadata>();

        var properties = ModelMetadataProviders.Current.GetMetadataForType(null, SelectedViewModel).Properties;
        return properties.Where(@p => !@p.PropertyName.EndsWith("PK_ID") && !@p.PropertyName.StartsWith("FK_") && !@p.PropertyName.EndsWith("_PK"));
    }

Я просто не могу найти там тип анона.

1 Ответ

0 голосов
/ 09 сентября 2010

A "... DisplayClass" обычно ассоциируется с анонимным методом, который должен захватывать переменные.

В этом случае я делаю ставку на лямбда-выражение, связанное с «select new SelectListItem ()», так как вы ссылаетесь на параметр метода.

Попробуйте закомментировать содержимое метода SetViewModelSelectList и посмотрите, исчезает ли анонимный тип.

...