Я написал класс для обработки общих функций для работы с биномиальным коэффициентом, который является типом проблемы, к которой относится ваша проблема. Он выполняет следующие задачи:
Чтобы прочитать об этом классе и загрузить код, см. Tablizing The Binomial Coeffieicent .
Не сложно преобразовать этот класс в C ++.
Если я правильно понимаю ваш вопрос, я думаю, что вы пытаетесь сделать это невозможно ...
В методе 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");
}
}
}
Используйте двойное число или число с плавающей запятой, когда вам не нужна точность, например, в написанной мной платформерной игре я использовал число с плавающей запятой для хранения скоростей игрока. Очевидно, мне здесь не нужна сверхточность, потому что я в итоге округляю Int для рисования на экране.
Следует также иметь в виду, что могут быть два поля , оба с одинаковым значением, то есть ссылающиеся на один и тот же объект. Будет ли объект считаться «необязательным» в этом случае или нет? По сути, если объект должен иметь свойство (например, необязательное или нет), то это должно быть свойство самого объекта, а не поле, содержащее свойство.Возможно, я неправильно истолковываю то, что вы пытаетесь сделать, но я подозреваю , что это либо неосуществимо, либо, по крайней мере, не является хорошей идеей. Не могли бы вы объяснить более широкую картину здесь? Чего вы действительно пытаетесь достичь с помощью этого атрибута?
необязательно или нет) тогда это должно быть свойством самого объекта, а не полем, содержащим это свойство.Возможно, я неправильно понимаю, что вы пытаетесь сделать, но я подозреваю это либо неосуществимо, либо, по крайней мере, не очень хорошая идея. Не могли бы вы объяснить более широкую картину здесь? Чего вы действительно пытаетесь достичь с помощью этого атрибута?
необязательно или нет) тогда это должно быть свойством самого объекта, а не полем, содержащим это свойство.Возможно, я неправильно понимаю, что вы пытаетесь сделать, но я подозреваю это либо неосуществимо, либо, по крайней мере, не очень хорошая идея. Не могли бы вы объяснить более широкую картину здесь? Чего вы действительно пытаетесь достичь с помощью этого атрибута?
Вот пример того, как дать одному объекту, как найти, имеют ли какие-либо открытые или закрытые поля этого объекта определенное свойство:
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;
}