У меня есть метод отражения, который находит все типы в пространстве имен:
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"));
}
Я просто не могу найти там тип анона.