代码之家  ›  专栏  ›  技术社区  ›  John Farrell

查找匿名类型的源

  •  1
  • John Farrell  · 技术社区  · 14 年前

    我有一个反射方法可以找到命名空间中的所有类型:

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

    我的问题是返回一个匿名类型,名称为: {Name=“<gt;c\u DisplayClass2”全名=”UCHC.CFAR.Web.Models.FieldSecurityViewModel模型+<gt;c\u DisplayClass2“}

    从我看到的情况来看,检测匿名类型很困难( 1141874 )但是我总是可以过滤“时髦”的名字,比如。Contains(“<>c”),所以这没什么大不了的。

    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 回复  |  直到 8 年前
        1
  •  0
  •   Lasse V. Karlsen    14 年前

    “…DisplayClass”通常与需要捕获变量的匿名方法相关联。

    在本例中,我将赌注押在与“select new SelectListItem()”关联的lambda表达式上,因为您将参数引用到方法。

    试着把文章的内容注释出来 SetViewModelSelectList