我有一个反射方法可以找到命名空间中的所有类型:
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"));
}
我就是找不到那种类型的。