Windows Vista Forums
Vista Forums Home Join Vista Forums Windows 7 Forum Vista Tutorials Tags
Welcome to Windows Vista Forums. Our forum is dedicated to helping you find solutions with any problems, errors or issues you are experiencing with Windows Vista. The Vista forum also covers news and updates and has an extensive Windows Vista tutorial section that covers a wide range of tips and tricks.

Go Back   Vista Forums > Misc Newsgroups > .NET General

Vista - Keeping the order of custom attributes

Reply
 
Old 07-19-2008   #1 (permalink)
Dmitry Nogin


 
 

Keeping the order of custom attributes

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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:E868EA76-654C-4FC4-95B5-E0022E139671@xxxxxx
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

"Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxx> wrote in message news:96B435C6-69DC-44BD-819E-682C1AA079BF@xxxxxx
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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:C8A856F5-D61B-484E-918C-F12A77265B60@xxxxxx
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

My System SpecsSystem Spec
Old 07-19-2008   #2 (permalink)
Nicholas Paldino [.NET/C# MVP]


 
 

Re: Keeping the order of custom attributes

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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:C8A856F5-D61B-484E-918C-F12A77265B60@xxxxxx
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



My System SpecsSystem Spec
Old 07-20-2008   #3 (permalink)
Dmitry Nogin


 
 

Re: Keeping the order of custom attributes

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

"Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxx> wrote in message news:96B435C6-69DC-44BD-819E-682C1AA079BF@xxxxxx
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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:C8A856F5-D61B-484E-918C-F12A77265B60@xxxxxx
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



My System SpecsSystem Spec
Old 07-20-2008   #4 (permalink)
Nicholas Paldino [.NET/C# MVP]


 
 

Re: Keeping the order of custom attributes

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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:E868EA76-654C-4FC4-95B5-E0022E139671@xxxxxx
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

"Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxx> wrote in message news:96B435C6-69DC-44BD-819E-682C1AA079BF@xxxxxx
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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:C8A856F5-D61B-484E-918C-F12A77265B60@xxxxxx
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



My System SpecsSystem Spec
Old 07-20-2008   #5 (permalink)
Dmitry Nogin


 
 

Re: Keeping the order of custom attributes

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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:E868EA76-654C-4FC4-95B5-E0022E139671@xxxxxx
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

"Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxx> wrote in message news:96B435C6-69DC-44BD-819E-682C1AA079BF@xxxxxx
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]
- mvp@xxxxxx
"Dmitry Nogin" <dmitry.nogin@xxxxxx> wrote in message news:C8A856F5-D61B-484E-918C-F12A77265B60@xxxxxx
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



My System SpecsSystem Spec
Reply

Thread Tools


Similar Threads
Thread Forum
Accessing custom types output from custom cmdlet's in C# GUI PowerShell
Custom order of 'All Programs' and 'Favorites' - Impossible? Vista General
changing and finding custom dictionary in vista? Office is loaded but I will not be keeping it. Vista General


Vista Forums is an independent web site and has not been authorized,
sponsored, or otherwise approved by Microsoft Corporation.
"Windows Vista", the Start Orb, and related materials are trademarks of Microsoft Corp.
© Designer Media Ltd

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46