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

How to get all the properties of items in List and convert them to a GridColumn using LINQ?

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

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

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

根据这些数据,我想显示除“UserRoles”之外的每个 属性,因此我创建了一个属性,使其能够隐藏数据:

属性:

public class HideInTableAttribute : Attribute
{
    
}

模态(用户)class:

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(在其他 class 中使用)的示例可以这样完成:

.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();

但是这给了我这个错误:

希望有人能帮忙,在此先感谢!

你可以试试这个:

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

Here T is the Class name

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

例如

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

NavigationMenu 是 class

如果您不知道 AssemblyQualifiedName,请查看如何获取它。

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

您也可以加载程序集然后获取类型。

DnetAdminDashboard 是程序集

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