Вот пример для одного объекта, как найти, имеют ли какие-либо открытые или закрытые поля этого объекта определенное свойство:
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;
}