Мне нужно создать атрибут для функций, которые будут создавать файлы в соответствии с заданным именем до вызов функции или даже если есть нет вызова функции.
Например, если у меня есть функция с atribute [some("C:\\hello.txt")]
:Как создать атрибут функции, которая создаст файл до или без вызова функции
[some("C:\\hello.txt")]
private void foo()
{
// do something
}
Когда я запустить приложение будет создавать этот файл («C: \ hello.txt») перед вызовом функции или даже если нет никакого вызова функции ..
Я попытался с двумя методами:
1. Создание файла в конструкторе
2. Создание файла с отражением.
Но никто из них не работал для меня.
Первая попытка (с конструктором):
Я пытался создать файл в конструкторе каждый раз, когда есть новый атрибут.
В этом методе я попытался создать файл до ввода функции Main.
Пока он анализирует функции, он найдет атрибуты и создаст файлы.
Ожидаемое:
Два файлы должны быть созданы:
1. C: \ hello.txt
2. C: \ bye.txt
В действительности => ничего не происходит.
[some("C:\\hello.txt")]
private void foo()
{
// do something
}
[some("C:\\bye.txt")]
private void foo()
{
// do something
}
public class someAttribute : Attribute
{
public someAttribute(string fileToCreate)
{
// File.Create(fileToCreate);
Console.WriteLine("Create file " + fileToCreate);
}
}
static void Main(string[] args)
{
// something
}
Вторая попытка (с отражением):
Ожидаемое:
Один файл должен быть создан:
1. C: \ hello.txt
В действительности => "типы" переменных пуст и ничего не создается.
[some(fileToCreate = "C:\\hello.txt")]
private void foo()
{
// do something
}
public class someAttribute : Attribute
{
public string fileToCreate {get; set;}
}
static void Main(string[] args)
{
var types = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetCustomAttributes<someAttribute>().Count() > 0
select t;
foreach(var t in types) // types is null
{
string n = t.Name;
foreach(var p in t.GetProperties())
{
// File.Create(fileToCreate)
Console.WriteLine(p.fileToCreate);
}
}
}
У вас есть список классов, к которым могут относиться атрибутивные функции? Если это так, то этот вопрос может быть полезен: http://stackoverflow.com/questions/2831809/how-would-i-use-reflection-to-call-all-the-methods-that-has-a-ertain- заказ АТТ. Чтобы получить атрибуты, привязанные к методу, вам нужно будет использовать отражение класса, к которому принадлежит метод. – purplecat
Что касается вашей первой попытки (поместив код созданного файла в конструктор атрибута), причина, по которой она не сработала, ответила здесь: http://stackoverflow.com/questions/1168535/when-is-a-custom-attributes -constructor перспективе # 1168590. – purplecat