是否可以检查属性中设置的命名参数

时间:2011-10-06 05:54:33

标签: c#

是否可以在C#属性中明确检查设置了哪些命名参数?

问题是我在属性中有两个bool类型的参数,我想明确检查它们中的哪一个被设置。我知道我可以让它们可以为空并在代码中检查它,但是有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

假设您控制属性本身,这似乎可以满足您的需求:

using System;

[AttributeUsage(AttributeTargets.All)]
class SampleAttribute : Attribute
{
    private bool hasFlag = false;
    public bool HasFlag { get { return hasFlag; } }

    private bool flag = false;
    public bool Flag
    {
        get { return flag; }
        set
        {
            flag = value;
            hasFlag = true;
        }
    }
}

class Test
{
    static void Main()
    {
        foreach (var method in typeof(Test).GetMethods())
        {
            var attributes = (SampleAttribute[])
                method.GetCustomAttributes(typeof(SampleAttribute), false);
            if (attributes.Length > 0)
            {
                Console.WriteLine("{0}: Flag={1} HasFlag={2}",
                                  method.Name,
                                  attributes[0].Flag,
                                  attributes[0].HasFlag);
            }
        }
    }

    [Sample(Flag = true)]
    public static void WithFlagTrue() {}

    [Sample(Flag = false)]
    public static void WithFlagFalse() {}

    [Sample]
    public static void WithoutFlag() {}
}

结果:

WithFlagTrue: Flag=True HasFlag=True
WithFlagFalse: Flag=False HasFlag=True
WithoutFlag: Flag=False HasFlag=False

我不确定这是不是一个好主意,请注意......

答案 1 :(得分:0)

如果您定义了此属性,则可以提供一种方法来返回所有已设置的参数。 如果没有,我认为你的问题等于如何检查对象中设置的属性。

答案 2 :(得分:0)

Bool值为truefalse,bool变量的默认值为false,因此您无法知道bool var的值是设置还是不是没有将它们定义为nullable然后检查无效,或者你可以为你拥有的每个布尔属性创建一个标志!

为什么你还需要它?这个检查不够你

if(myBoolProp)
{
   //My boolean var is checked, lets do something
}
else
{
   //My boolean var not checked :( cant do anything
}

答案 3 :(得分:0)

请尝试:

[AttributeUsage(AttributeTargets.All)]
public class MyAttribute : Attribute
{
    private Nullable<int> _PropertyI;
    private Nullable<bool> _PropertyB;
    private String _Name;

    public int PropertyI
    {
        get
        {
            return _PropertyI.HasValue ? _PropertyI.Value : default(int);
        }
        set
        {
            this._PropertyI = value;
        }
    }

    public bool PropertyB
    {
        get
        {
            return _PropertyB.HasValue ? _PropertyB.Value : default(bool);
        }
        set
        {
            this._PropertyB = value;
        }
    }

    public String Name
    {
        get
        {
            return this._Name;
        }
        set
        {
            this._Name = value;
        }
    }

    public String[] GetAvailableParameters()
    {
        IList<String> names = new List<String>();

        Type type = this.GetType();
        FieldInfo[] fields
            = type.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic);
        foreach (FieldInfo field in fields)
        {
            Type fieldType = field.FieldType;
            Object fieldValue = field.GetValue(this);
            if (fieldValue != null)
            {
                names.Add(field.Name.Substring(1));
            }
        }

        return names.ToArray();
    }
}