如何使用.NET获取属性中的构造函数参数名称?

时间:2013-04-10 09:39:34

标签: c# .net vb.net

以下是代码:

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

属性是这样的:

[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。

2 个答案:

答案 0 :(得分:2)

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

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

但是,要使NamedArguments起作用,实际上在使用属性时必须使用这些名称。您的更新代码显示您不这样做。

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

答案 1 :(得分:2)

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