Есть ли способ ограничения foreach l oop через свойства класса в C#? - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь создать метод класса, чтобы заполнить некоторые свойства флага из целочисленного значения, содержащего, какие флаги имеют значение true в двоичном формате. Идея метода состоит в том, чтобы l oop просмотреть свойства флага одно за другим и установить их в соответствии с соответствующим битом в целом числе.

Насколько я понимаю, используя эту структуру

public void FillFlags( int combinedFlags )
{
    foreach (PropertyInfo prop in GetType().GetProperties() )
    {
         //Do Something
    }
}

будет перебирать все свойств созданного объекта.

Можно ли ограничить l oop, скажем, только свойствами в регионе?

Как:

#region Flags
public bool HAS_POSITION { get; set; }
public bool HAS_SOURCE { get; set; }
public bool HAS_DESTINATION { get; set; }
public bool HAS_SUBJECT { get; set; }
#endregion

Я использую Visual Studio Издание сообщества 2017 года.

1 Ответ

5 голосов
/ 21 января 2020

Нет, регионы недоступны во время выполнения.

Например, вы можете создать атрибут и использовать его для свойств, которые вы хотите перебрать.

[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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...