【问题标题】:Finding an Anonymous Type's Source查找匿名类型的来源
【发布时间】:2010-09-09 17:48:02
【问题描述】:

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

        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),但我总是可以过滤“时髦”的名称,即 .Contains("c_ ") 所以这没什么大不了的。

我只是想找到这个匿名类型,以便我可以重构它。我正在检查的命名空间是我的 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"));
    }

我只是在其中找不到匿名类型。

【问题讨论】:

  • 你确定它在这段代码中吗?
  • 你能把源发布到那个匿名类型吗?我打赌它是您在这里使用的 lambda 表达式之一,但是看到反射的源可以为确切的源提供有价值的提示(不是双关语。)
  • @Lasse V. Karlsen 根据反射器的来源。它来自 SetViewModelSelectList 但我不明白为什么。

标签: c# asp.net-mvc reflection anonymous-types


【解决方案1】:

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

在这种情况下,我押注与“select new SelectListItem()”关联的 lambda 表达式,因为您指的是方法的参数。

尝试注释掉SetViewModelSelectList方法的内容,看看匿名类型是否消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多