Keeping the order of custom attributes

D

Dmitry Nogin

Hi,
Is it possible to make the C# compiler to keep the order of Custom attributes as it is in the source file?

For example, I've got the following output from the code snippet below: 4, 3, 1, 2
Can I preserve the original order at the moment of compilation?


[Test(1)]

[Test(2)]

[Test(3)]

[Test(4)]

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();



foreach (TestAttribute a in GetType().GetCustomAttributes(typeof(TestAttribute), true))

MessageBox.Show(a.Ordinal.ToString());

}

}



[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]

public class TestAttribute : Attribute

{

private readonly int _ordinal;



public TestAttribute(int ordinal)

{

_ordinal = ordinal;

}



public int Ordinal

{

get { return _ordinal; }

}

}



Thanks,

-- dmitry
 
N

Nicholas Paldino [.NET/C# MVP]

Dmitry,

No, it isn't. However, if you are using LINQ, you can do so by exposing a property through the attrbitute which exposes the 1, 2, 3, 4, and then ordering on that property.


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)
Hi,
Is it possible to make the C# compiler to keep the order of Custom attributes as it is in the source file?

For example, I've got the following output from the code snippet below: 4, 3, 1, 2
Can I preserve the original order at the moment of compilation?


[Test(1)]

[Test(2)]

[Test(3)]

[Test(4)]

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();



foreach (TestAttribute a in GetType().GetCustomAttributes(typeof(TestAttribute), true))

MessageBox.Show(a.Ordinal.ToString());

}

}



[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]

public class TestAttribute : Attribute

{

private readonly int _ordinal;



public TestAttribute(int ordinal)

{

_ordinal = ordinal;

}



public int Ordinal

{

get { return _ordinal; }

}

}



Thanks,

-- dmitry
 
D

Dmitry Nogin

Dear Nicholas,
Thank you a lot.

Do I have any chances to generate these ordinals automatically? Or validate its order at runtime while debug build is executed?
It looks like StackFrame.GetFileLineNumber method will not help here...


-- dmitry

Dmitry,

No, it isn't. However, if you are using LINQ, you can do so by exposing a property through the attrbitute which exposes the 1, 2, 3, 4, and then ordering on that property.


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)
Hi,
Is it possible to make the C# compiler to keep the order of Custom attributes as it is in the source file?

For example, I've got the following output from the code snippet below: 4, 3, 1, 2
Can I preserve the original order at the moment of compilation?


[Test(1)]

[Test(2)]

[Test(3)]

[Test(4)]

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();



foreach (TestAttribute a in GetType().GetCustomAttributes(typeof(TestAttribute), true))

MessageBox.Show(a.Ordinal.ToString());

}

}



[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]

public class TestAttribute : Attribute

{

private readonly int _ordinal;



public TestAttribute(int ordinal)

{

_ordinal = ordinal;

}



public int Ordinal

{

get { return _ordinal; }

}

}



Thanks,

-- dmitry
 
N

Nicholas Paldino [.NET/C# MVP]

Dmitry,

You could generate the ordinals at runtime, but they would be generated in the order they are created, not in the manner you are expecting, so that's not really an option.

What exactly are you trying to do?


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)
Dear Nicholas,
Thank you a lot.

Do I have any chances to generate these ordinals automatically? Or validate its order at runtime while debug build is executed?
It looks like StackFrame.GetFileLineNumber method will not help here...


-- dmitry

Dmitry,

No, it isn't. However, if you are using LINQ, you can do so by exposing a property through the attrbitute which exposes the 1, 2, 3, 4, and then ordering on that property.


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)
Hi,
Is it possible to make the C# compiler to keep the order of Custom attributes as it is in the source file?

For example, I've got the following output from the code snippet below: 4, 3, 1, 2
Can I preserve the original order at the moment of compilation?


[Test(1)]

[Test(2)]

[Test(3)]

[Test(4)]

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();



foreach (TestAttribute a in GetType().GetCustomAttributes(typeof(TestAttribute), true))

MessageBox.Show(a.Ordinal.ToString());

}

}



[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]

public class TestAttribute : Attribute

{

private readonly int _ordinal;



public TestAttribute(int ordinal)

{

_ordinal = ordinal;

}



public int Ordinal

{

get { return _ordinal; }

}

}



Thanks,

-- dmitry
 
D

Dmitry Nogin

Hi Nicholas,

My framework supports extra attributes on the grid control datasource (typed DataTable or business object collection) to provide some extra information for my control which is smart enough to read it.

For example, I have an attribute to generate extra buttons in the grid header to turn on/turn off multiple columns in one touch.

The usage looks like this:

[GridSwitch("Name", // string buttonText,

"FirstName", "LastName")] // params string[] columns

[GridSwitch("Contacts",

"Address", "Phone", "Fax")]

class EmployeeCollection : IBindingList, IList<Employee>

{

...

}



class Employee : INotifyPropertyChanged

{

public string FirstName { get; set; }

public string LastName { get; set; }

public string Address { get; set; }

public string Phone { get; set; }

public string Fax { get; set; }

}

So we are about to receive the following grid control on the screen:
/------------------------------------------------------------------------------\| Employees [Name] [Contacts] | [Organize v] [Customize v] ||------------------------------------------------------------------------------|| First Name | Last Name | Address | Phone | Fax ||------------------------------------------------------------------------------|| Dmitry | Nogin | 130 rue de la...| 123-4567 | 222-2222 || Tim | Horton | 111 Somewhere...| 765-4321 | 333-3333 || | | | | |\------------------------------------------------------------------------------/
where [Name] and [Contacts] buttons are generated automatically and can toggle visibility of associated columns; the problem is that users of my controls expect me to show the buttons according to the order of attributes.

I have attributing to specify defaults for many grid settings, like column summaries, formatting, grouping, inplace editors, etc... It's not so common to depend on attribute order, but it happens from time to time. I used to use extra Ordinal parameter, but people do not understand what is the meaning of it; why it is not possible to deduce the desired position from the declaration order, so it would be greate to be able to check its value at debug time or something...


-- dmitry

Dmitry,

You could generate the ordinals at runtime, but they would be generated in the order they are created, not in the manner you are expecting, so that's not really an option.

What exactly are you trying to do?


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)
Dear Nicholas,
Thank you a lot.

Do I have any chances to generate these ordinals automatically? Or validate its order at runtime while debug build is executed?
It looks like StackFrame.GetFileLineNumber method will not help here...


-- dmitry

Dmitry,

No, it isn't. However, if you are using LINQ, you can do so by exposing a property through the attrbitute which exposes the 1, 2, 3, 4, and then ordering on that property.


--
- Nicholas Paldino [.NET/C# MVP]
- (e-mail address removed)
Hi,
Is it possible to make the C# compiler to keep the order of Custom attributes as it is in the source file?

For example, I've got the following output from the code snippet below: 4, 3, 1, 2
Can I preserve the original order at the moment of compilation?


[Test(1)]

[Test(2)]

[Test(3)]

[Test(4)]

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();



foreach (TestAttribute a in GetType().GetCustomAttributes(typeof(TestAttribute), true))

MessageBox.Show(a.Ordinal.ToString());

}

}



[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]

public class TestAttribute : Attribute

{

private readonly int _ordinal;



public TestAttribute(int ordinal)

{

_ordinal = ordinal;

}



public int Ordinal

{

get { return _ordinal; }

}

}



Thanks,

-- dmitry
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top