2010-09-09 60 views
1

我有一個反射方法找到的所有類型的命名空間:找到一個匿名類型的源

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

我的問題是我與名返回一個匿名類型: {名稱=「<> c__DisplayClass2" 全名=‘UCHC.CFAR.Web.Models.FieldSecurityViewModel + <> c__DisplayClass2’}

現在,從我所看到檢測匿名類型都難以(1141874),但我總能過濾‘時髦’的名字,即。包含(「<> 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 => [email protected]("Admin") && [email protected]("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 => [email protected]("PK_ID") && [email protected]("FK_") && [email protected]("_PK")); 
    } 

我只是找不到那裏的anon類型。

+0

你確定它是在這個代碼? – 2010-09-09 17:51:00

+1

是通過反射器。 – jfar 2010-09-09 18:22:15

+0

您可以將源發佈到該匿名類型嗎?我敢打賭,這是你在這裏的lambda表達式之一,但看到反射源可以給出確切的來源有價值的提示(沒有雙關語意思。) – 2010-09-09 18:28:58

回答

0

「... DisplayClass」通常與需要捕獲變量的匿名方法關聯。

在這種情況下,我打賭與「select new SelectListItem()」相關聯的lambda表達式,因爲您指的是該方法的參數。

嘗試註釋掉SetViewModelSelectList方法的內容,並查看匿名類型是否消失。