如何使用LINQ获取List中项目的所有属性并将其转换为GridColumn?

问题描述

我正在编写一个应用程序,我在其中获取这样的数据(字符串“ SettingsSubPage”代表数据模型的名称在这种情况下为“ User”):

[Parameter]
public string SettingsSubPage { get; set; }

Results = ApiProvider.GetAll(System.Type.GetType(SettingsSubPage));

enter image description here

我想从此数据中显示除“ UserRoles”以外的所有属性,因此我创建了一个使其能够隐藏数据的属性

属性

public class HideInTableAttribute : Attribute
{
    
}

Modal(User)类:

public class User
{
    public int Id { get; set; }

    [required(ErrorMessage = "Email is required")]
    [DataType(DataType.EmailAddress)]
    [EmailAddress(ErrorMessage = "This is not a valid email adress")]
    public string Email { get; set; }

    [required(ErrorMessage = "Password is required")]
    [DataType(DataType.Password)]
    [StringLength(50,MinimumLength = 5,ErrorMessage = "Password must be between 5 and 50 characters")]
    public string Password { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public bool Enabled { get; set; }

    public DateTime LastLogin { get; set; }

    */ HERE WE HIDE THE PROPERTY /*
    [HideInTable]
    public List<UserRole> UserRoles { get; set; }
}

现在,我想获取除“ UserRoles”之外的这些属性的列表,并将它们设置为GridColumns,以便获得GridColumns的列表。一个如何使它们成为GridColumns(用于其他类)的示例可以像这样完成:

.Select(x => new GridColumn()
                    {
                        Field = x.Name,HeaderText = x.Name,TextAlign = TextAlign.Center
                    })
                    .ToList();

因此,我需要一个LINQ查询,该查询获取“ SettingsSubpage”模型的属性并将其转换为GridColumns并将它们放入列表中,到目前为止,我一直在尝试以下方法

List<System.Reflection.PropertyInfo> list = System.Type.GetType(SettingsSubPage).GetProperties().Where(x => x.GetCustomAttributes(true).OfType<HideInTableAttribute>().Any()).ToList();

但是这给了我这个错误

enter image description here

希望有人可以提供帮助,谢谢!

解决方法

您可以尝试一次:

var propsList = typeof(T).GetProperties(BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance)
                .Where(x => !Attribute.IsDefined(x,typeof(HideInTableAttribute)))
                .ToList();

这里T是班级名称

,

如果您的类型在另一个Assembly中,则需要在GetType的typeName参数中提供AssemblyQualifiedName。

例如。

 var mytype= Type.GetType("DnetAdminDashboard.DesktopNavigation.NavigationMenu,DnetAdminDashboard,Version=1.3.13.0,Culture=neutral,PublicKeyToken=null",true);

NavigationMenu是类

如果您不知道AssemblyQualifiedName,请参阅如何获取它。

https://docs.microsoft.com/en-us/dotnet/api/system.type.assemblyqualifiedname?view=netcore-3.1#System_Type_AssemblyQualifiedName

还可以加载Assembly,然后获取类型。

DnetAdminDashboard是程序集

 var assm = Assembly.Load("DnetAdminDashboard");
 var myType = assm.GetTypes().FirstOrDefault(p => p.Name == "NavigationMenu");