Отражение в C #: поиск атрибутов в поле участника

Я написал класс для обработки общих функций для работы с биномиальным коэффициентом, который является типом проблемы, к которой относится ваша проблема. Он выполняет следующие задачи:

  1. Выводит все K-индексы в хорошем формате для любого N, выбирающего K в файл. K-индексы могут быть заменены более описательными строками или буквами. Этот метод позволяет решить этот тип проблемы довольно тривиально.
  2. Преобразует K-индексы в собственный индекс записи в таблице отсортированных биномиальных коэффициентов. Этот метод намного быстрее, чем более старые опубликованные методы, основанные на итерации. Он делает это, используя математическое свойство, присущее Треугольнику Паскаля. В моей статье говорится об этом. Я считаю, что я первый, кто открыл и опубликовал эту технику, но я мог ошибаться.
  3. Преобразует индекс в отсортированную таблицу биномиальных коэффициентов в соответствующие K-индексы.
  4. Использует Метод Mark Dominus для вычисления биномиального коэффициента, который гораздо реже переполняется и работает с большими числами.
  5. Класс написан на .NET C # и предоставляет способ управления объекты, связанные с проблемой (если есть), используя общий список. Конструктор этого класса принимает значение bool, называемое InitTable, которое, когда true, создаст общий список для хранения объектов, которые будут управляться. Если это значение ложно, то оно не создаст таблицу. Таблицу не нужно создавать, чтобы выполнить описанные выше методы. Для доступа к таблице предоставляются методы доступа.
  6. Существует связанный тестовый класс, который показывает, как использовать класс и его методы.

Чтобы прочитать об этом классе и загрузить код, см. Tablizing The Binomial Coeffieicent .

Не сложно преобразовать этот класс в C ++.

16
задан Hugoware 29 April 2009 в 16:52
поделиться

3 ответа

Если я правильно понимаю ваш вопрос, я думаю, что вы пытаетесь сделать это невозможно ...

В методе Render вы хотите получить Возможный атрибут применяется к объекту. Атрибут принадлежит полю _SecondPart , принадлежащему классу HtmlForm .

Для этого вам придется передать вызывающий объект в Render Метод:

    public class HtmlPart {
        public void Render(object obj) {
            FieldInfo[] infos = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            foreach (var fi in infos)
            {
                if (fi.GetValue(obj) == this && fi.IsDefined(typeof(OptionalAttribute), true))
                    Console.WriteLine("Optional is Defined");
            }
        }
    }
13
ответ дан 30 November 2019 в 21:11
поделиться

Используйте двойное число или число с плавающей запятой, когда вам не нужна точность, например, в написанной мной платформерной игре я использовал число с плавающей запятой для хранения скоростей игрока. Очевидно, мне здесь не нужна сверхточность, потому что я в итоге округляю Int для рисования на экране.

Следует также иметь в виду, что могут быть два поля , оба с одинаковым значением, то есть ссылающиеся на один и тот же объект. Будет ли объект считаться «необязательным» в этом случае или нет? По сути, если объект должен иметь свойство (например, необязательное или нет), то это должно быть свойство самого объекта, а не поле, содержащее свойство.

Возможно, я неправильно истолковываю то, что вы пытаетесь сделать, но я подозреваю , что это либо неосуществимо, либо, по крайней мере, не является хорошей идеей. Не могли бы вы объяснить более широкую картину здесь? Чего вы действительно пытаетесь достичь с помощью этого атрибута?

необязательно или нет) тогда это должно быть свойством самого объекта, а не полем, содержащим это свойство.

Возможно, я неправильно понимаю, что вы пытаетесь сделать, но я подозреваю это либо неосуществимо, либо, по крайней мере, не очень хорошая идея. Не могли бы вы объяснить более широкую картину здесь? Чего вы действительно пытаетесь достичь с помощью этого атрибута?

необязательно или нет) тогда это должно быть свойством самого объекта, а не полем, содержащим это свойство.

Возможно, я неправильно понимаю, что вы пытаетесь сделать, но я подозреваю это либо неосуществимо, либо, по крайней мере, не очень хорошая идея. Не могли бы вы объяснить более широкую картину здесь? Чего вы действительно пытаетесь достичь с помощью этого атрибута?

5
ответ дан 30 November 2019 в 21:11
поделиться

Вот пример того, как дать одному объекту, как найти, имеют ли какие-либо открытые или закрытые поля этого объекта определенное свойство:

var type = typeof(MyObject);
foreach (var field in type.GetFields(BindingFlags.Public |
             BindingFlags.NonPublic | BindingFlags.Instance))
{
    if (field.IsDefined(typeof(ObsoleteAttribute), true))
    {
        Console.WriteLine(field.Name);
    }

}

Для второй части вашего вопроса вы можете проверить, если Атрибут является определяющим для текущего метода с использованием:

MethodInfo.GetCurrentMethod().IsDefined(typeof(ObsoleteAttribute));

Редактировать

Чтобы ответить на ваше изменение, да, это возможно, не зная фактического типа. Следующая функция принимает тип Parameter и возвращает все поля, которые имеют данный атрибут. Кто-то где-то собирается узнать тип, который вы хотите найти, или у вас будет экземпляр типа, который вы хотите искать.

Без этого вам придется делать, как сказал Джон Скит, который должен перечислять все объекты в сборка.

   public List<FieldInfo> FindFields(Type type, Type attribute)
    {
        var fields = new List<FieldInfo>();
        foreach (var field in type.GetFields(BindingFlags.Public |
                           BindingFlags.NonPublic |
                           BindingFlags.Instance))
        {
            if (field.IsDefined(attribute, true))
            {
                fields.Add(field);
            }

        }
        return fields;
    }
10
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: