Когда конструктор пользовательского атрибута выполняется?

Если в вашей папке несколько файлов SQL, и вы установили Git Bash , вы можете использовать эту команду для импорта нескольких файлов:

cd /my-project/data

cat *.sql | /c/xampp/mysql/bin/mysql -u root -p 1234 myProjectDbName

73
задан Roman Starkov 6 August 2012 в 18:49
поделиться

3 ответа

Когда запускается конструктор? Попробуйте это с примером:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Creating MyClass instance");
        MyClass mc = new MyClass();
        Console.WriteLine("Setting value in MyClass instance");
        mc.Value = 1;
        Console.WriteLine("Getting attributes for MyClass type");
        object[] attributes = typeof(MyClass).GetCustomAttributes(true);
    }

}

[AttributeUsage(AttributeTargets.All)]
public class MyAttribute : Attribute
{
    public MyAttribute()
    {
        Console.WriteLine("Running constructor");
    }
}

[MyAttribute]
class MyClass
{
    public int Value { get; set; }
}

А что будет на выходе?

Creating MyClass instance
Setting value in MyClass instance
Getting attributes for MyClass type
Running constructor

Итак, конструктор атрибута запускается, когда мы начинаем исследовать атрибут. Обратите внимание, что атрибут извлекается из типа, а не из экземпляра типа.

66
ответ дан 24 November 2019 в 12:24
поделиться

Метаданные в исполняемых файлах или хранилищах DLL:

  • токен метаданных , указывающий на конструктор для вызова
  • Аргументы

Когда я добираюсь до этого раздела В моей реализации CLI я планирую лениво вызывать конструктор при первом вызове GetCustomAttributes () для ICustomAttributeProvider . Если запрашивается конкретный тип атрибута, я построю только те, которые необходимы для возврата этого типа.

4
ответ дан 24 November 2019 в 12:24
поделиться

Установите точку останова отладчика внутри конструктора атрибутов и напишите некоторый код отражения, который считывает эти атрибуты. Вы заметите, что объекты атрибутов не будут созданы, пока они не будут возвращены из API-интерфейса relfection. Атрибуты для каждого класса . Они являются частью метаданных.

Взгляните на это:

Program.cs

using System;
using System.Linq;
[My(15)]
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Program started");
        var ats =
            from a in typeof(Program).GetCustomAttributes(typeof(MyAttribute), true)
            let a2 = a as MyAttribute
            where a2 != null
            select a2;

        foreach(var a in ats)
            Console.WriteLine(a.Value);

        Console.WriteLine("Program ended");
        Console.ReadLine();
    }
}

MyAttribute.cs

using System;
[AttributeUsage(validOn : AttributeTargets.Class)]
public class MyAttribute : Attribute
{
    public MyAttribute(int x)
    {
        Console.WriteLine("MyAttribute created with {0}.", x);
        Value = x;
    }

    public int Value { get; private set; }    
}

Result

Program started
MyAttribute created with 15.
15
Program ended

Но не беспокойтесь о производительности конструкторов атрибутов.

6
ответ дан 24 November 2019 в 12:24
поделиться