【问题标题】:How to get constructor arguments name in attributes with .NET?如何使用 .NET 在属性中获取构造函数参数名称?
【发布时间】:2013-04-10 09:39:33
【问题描述】:

代码如下:

我正在寻找一种按名称访问参数值的方法。

属性是这样的:

[AttributeUsage(AttributeTargets.Field)]
public class EDataAttrAttribute : Attribute {

    public EDataAttrAttribute(int GroupID, int MinimumPermissionToEdit, bool ForcePersianLetter = false) {
        this.GroupID = GroupID;
        this.MinimumPermissionToEdit = MinimumPermissionToEdit; 
    }


    public int GroupID { get; private set; }
    public int MinimumPermissionToEdit { get; private set; } 

}

public class EUser {
    [EDataAttr(1, 1)]
    public string FirstName;
}

                    var attr = typeof(T).GetField("FirstName").CustomAttributes.FirstOrDefault(a => a.AttributeType == typeof(EDataAttrAttribute));
                    int n = attr.ConstructorArguments.Count; // 2 !
                    int v = attr.NamedArguments.Count;       // 0 !

如何在不知道索引 int 的情况下获取 MinimumPermissionToEdit 值。
我只知道它被命名为 MinimumPermissionToEdit。

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

    您可以为此使用 LINQ。此外,您必须使用NamedArguments 属性而不是ConstructorArguments:

    NamedArguments.Single(x => x.MemberName == "Name").Value
    

    但是,要使NamedArguments 起作用,您实际上必须在使用属性时使用名称。您更新的代码表明您没有这样做。

    在这种情况下,无法通过名称获取值。你只需要使用索引。与您所说的相反,索引众所周知。它是它出现在构造函数中的索引。 MinimumPermissionToEdit出现在第二个位置,所以它的索引是1。

    【讨论】:

    • 当我的属性中有三个属性时,这不会返回任何数据。
    • @Mahdi:正如 Jon 所说,请向我们展示您如何使用该属性。你用属性类的声明更新了你的代码,而不是它的用法。
    • 你能告诉我如何在我的属性上使用名称吗?
    • @Mahdi: [EDataAttr(GroupID = 1, MinimumPermissionToEdit = 1)]
    【解决方案2】:

    您可以使用NamedArguments 访问这些; CustomAttributeNamedArgument 上的 MemberInfo 属性允许您反映将使用命名属性参数设置的成员。

    【讨论】:

    • 当我的属性中有三个属性时,这不会返回任何数据。
    • @Mahdi:向我们展示你是如何实例化属性的。
    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2021-07-06
    • 2023-03-17
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多