Я создал настраиваемый атрибут с именем someAttribute
.
Это логический элемент с именем Skip
:Как использовать атрибуты 'внутри метода
public class someAttribute : Attribute
{
public bool Skip { get; set; }
}
В Main
я инициализирован элемент Skip
со значением true
для метода foo()
.
Затем я звоню функцию foo()
которая имеет атрибут [someAttribute()]
, и я хочу, чтобы проверить, если член Skip
был инициализирован:
[someAttribute()]
private static int foo()
{
if(Skip)
{
return 0;
}
return 1;
}
я получил ошибку "Название„Пропустить“не существует в текущий контекст ".
Как проверить элементы атрибута внутри метода, использующего этот атрибут?
Мой полный код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace ConsoleApplication1
{
class ProgramTest
{
[someAttribute()]
private static int foo()
{
if(Skip)
{
return 0;
}
return 1;
}
public class someAttribute : Attribute
{
public bool Skip { get; set; }
}
public static void initAttributes()
{
var methods = Assembly.GetExecutingAssembly().GetTypes().SelectMany(t => t.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static))
.Where(method => Attribute.IsDefined(method, typeof(someAttribute)));
foreach (MethodInfo methodInfo in methods)
{
IEnumerable<someAttribute> SomeAttributes = methodInfo.GetCustomAttributes<someAttribute>();
foreach (var attr in SomeAttributes)
{
attr.Skip = true;
}
}
}
static void Main(string[] args)
{
initAttributes();
int num = foo();
}
}
}
EDIT:
Я добавил BindingFlags.Static
для того, чтобы refelction, чтобы получить статическую функцию foo()
.
Возможный дубликат [Отражение - получить имя атрибута и значение на имущество] (http://stackoverflow.com/questions/6637679/reflection-get-attribute-name-and-value-on-property) – HimBromBeere
Я полагаю, вам понадобится 'BindingFlags.Static | BindingFlags.NonPublic' как ваш 'foo'-метод -' private static'. – HimBromBeere
Я отредактировал код и добавил его, спасибо. – E235