Нет, регионы недоступны во время выполнения.
Например, вы можете создать атрибут и использовать его для свойств, которые вы хотите перебрать.
[AttributeUsage(AttributeTargets.Property)]
public class ReflectThisAttribute : Attribute
{
}
И использовать его как this:
[ReflectThis]
public bool HAS_POSITION { get; set; }
[ReflectThis]
public bool HAS_SOURCE { get; set; }
[ReflectThis]
public bool HAS_DESTINATION { get; set; }
[ReflectThis]
public bool HAS_SUBJECT { get; set; }
Что позволяет вам:
public void FillFlags( int combinedFlags )
{
foreach (PropertyInfo prop in GetType().GetProperties() )
{
if (prop.GetCustomAttribute<ReflectThisAttribute> == null)
continue;
// Only get here if the property have the attribute
}
}
Вы также можете проверить, является ли это bool
:
public void FillFlags( int combinedFlags )
{
foreach (PropertyInfo prop in GetType().GetProperties() )
{
if (prop.PropertyType != typeof(bool))
continue;
// Only get here if the property is a bool
}
}
Однако!
Поскольку похоже, что метод FillFlags
является частью класса, который вы хотите изменить, я бы порекомендовал вам присваивать ему свойства вручную. Код станет намного более читабельным, чем попытка использовать отражение.
Отражение обычно используется для обобщения решений. Например:
[AttributeUsage(AttributeTargets.Property)]
public class FlagValueAttribute : Attribute
{
public FlagValueAttribute (int value)
{
Value = value;
}
public int Value{get;set}
}
public class SomeEntity
{
[FlagValue(1)]
public bool HAS_POSITION { get; set; }
[FlagValue(2)]
public bool HAS_SOURCE { get; set; }
[FlagValue(4)]
public bool HAS_DESTINATION { get; set; }
[FlagValue(8)]
public bool HAS_SUBJECT { get; set; }
}
public static class EntityExtensions
{
public static void FillFlags(this object instance, int combinedFlags )
{
foreach (PropertyInfo prop in instance.GetType().GetProperties() )
{
var attr = prop.GetCustomAttribute<FlagValueAttribute>();
if (attr == null)
continue;
if ((attr.Value & combinedFlags) != 0)
prop.SetValue(instance, true);
}
}
}
Использование:
var myEntity = new SomeEntity();
// will set HAS_SOURCE and HAS_SUBJECT to true
myEntity.FillFlags(10);