Pasando un tipo como parámetro a un atributo

Escribí un mecanismo de deserialización un tanto genérico que me permite construir objetos a partir de un formato de archivo binario utilizado por una aplicación C ++.

Para mantener las cosas limpias y fáciles de cambiar, hice una clase de Field que amplía el Attribute , se construye con el Field(int offset, string type, int length, int padding) y se aplica a los atributos de la clase que deseo deserializar. Así es como esto luce :

 [Field(0x04, "int")] public int ID = 0; [Field(0x08, "string", 0x48)] public string Name = "0"; [Field(0x6C, "byte", 3)] public byte[] Color = { 0, 0, 0 }; [Field(0x70, "int")] public int BackgroundSoundEffect = 0; [Field(0x74, "byte", 3)] public byte[] BackgroundColor = { 0, 0, 0 }; [Field(0x78, "byte", 3)] public byte[] BackgroundLightPower = { 0, 0, 0 }; [Field(0x7C, "float", 3)] public float[] BackgroundLightAngle = { 0.0f, 0.0f, 0.0f }; 

Al llamar a myClass.Decompile(pathToBinaryFile) , se extraerán los datos del archivo, y se leerán los tipos y tamaños adecuados con las compensaciones adecuadas.

Sin embargo, me parece que pasar el nombre de tipo como una cadena es feo.

¿Es posible pasar el tipo de una manera más elegante pero corta, y cómo?

Gracias.

Utilice el operador typeof (devuelve una instancia de Type ):

 [Field(0x7C, typeof(float), 3)] 

Sí: haga que el atributo tome un Type como parámetro y luego pase, por ejemplo, typeof(int) .

Sí, el parámetro debe ser de tipo Type y luego puede pasar el tipo de la siguiente manera:

 [Field(0x7C, typeof(float), 3)] public float[] BackgroundLightAngle = { 0.0f, 0.0f, 0.0f }; 

No creo que debas poner el tipo en el constructor del atributo, puedes obtenerlo del campo. Vea el ejemplo:

 public class FieldAttribute : Attribute { } class Data { [Field] public int Num; [Field] public string Name; public decimal NonField; } class Deserializer { public static void Deserialize(object data) { var fields = data.GetType().GetFields(); foreach (var field in fields) { Type t = field.FieldType; FieldAttribute attr = field.GetCustomAttributes(false) .Where(x => x is FieldAttribute) .FirstOrDefault() as FieldAttribute; if (attr == null) return; //now you have the type and the attribute //and even the field with its value } } }