enumeraciones - Obtener valores de los atributos de campo personalizados en C#
enum c# español (1)
Esta mañana me embarqué en lo que pensé que sería un ejercicio rápido para usar atributos de campo personalizados. Habiendo probado muchas cosas y buscando muchos ejemplos (la mayoría involucrando clase en lugar de atributos de campo), estoy oficialmente estancado.
Mi código está abajo. Una peculiaridad es que la clase está construida en FileHelpers usando classbuilder. Mis varios intentos parcialmente exitosos lograron obtener los nombres de campo de esta clase, así que creo que esa parte funciona bien.
Lo que quiero hacer (por el comentario en el código) es a) Ejecutar a través de los campos, b) para cada uno, ver si existe el atributo DBDataTypeAttribute, y c) La parte aparentemente más difícil: obtener los valores del atributo (cadena FieldType y AllowNulls bool).
Cualquier comentario apreciado!
marca
class Program
{
static void Main(string[] args)
{
// Desired output:
System.Type userType = null;
userType = ClassBuilder.ClassFromString(@"
public class ExpenseReport
{
[FieldQuoted(''""'', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
[DBDataTypeAttribute(FieldType = ""varchar(1000)"", AllowNulls = true)]
public String UniqueID;
[FieldQuoted(''""'', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
public String ERNum;
}");
object[] attributes;
attributes = userType.GetCustomAttributes(typeof(DBDataTypeAttribute), true);
foreach (Object attribute in attributes)
{
// Would like to be able to ID for each field whether the DBDataTypeAttribute is present, and get the FieldType and AllowNulls Values
DBDataTypeAttribute a = (DBDataTypeAttribute)attribute;
Console.WriteLine("Attribute: ", a.FieldType);
Console.ReadLine();
}
}
}
[AttributeUsage(AttributeTargets.Field)]
public class DBDataTypeAttribute : System.Attribute
{
private string fieldtype;
public string FieldType
{
get { return fieldtype; }
}
private string allownulls;
public string AllowNulls
{
get { return allownulls; }
}
}
Bastante simple; tienes que obtenerlos de los campos, no del tipo.
foreach( FieldInfo field in userType.GetFields() )
{
DBDataTypeAttribute attribute = (DBDataTypeAttribute)Attribute.GetCustomAttribute(field, typeof(DBDataTypeAttribute));
if( attribute != null )
{
// Do something with it.
}
}