是否可以在C#属性中明确检查设置了哪些命名参数?
问题是我在属性中有两个bool类型的参数,我想明确检查它们中的哪一个被设置。我知道我可以让它们可以为空并在代码中检查它,但是有更好的方法吗?
答案 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
值为true
或false
,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();
}
}