public static void Main(string[] args)
var dadosOrdenados = new string[] { "1", "13-01-2015", "abc", "0.123" };
var objeto = FabricaObjeto.Constroi(dadosOrdenados);
string.Format("{0} - {1} - {2} - {3}"
, objeto._numero, objeto._data, objeto._palavra, objeto._decimal));
public delegate object ConverteValor(string valor, Type type);
public class DadoAttribute : Attribute
public int Ordem { get; private set; }
public DadoAttribute(int ordem)
public virtual ConverteValor ConverteValor
get { return (string valor, Type type) => (Convert.ChangeType(valor, type)); }
public class DadoData : DadoAttribute
private String formatoData;
public DadoData(int ordem, String formatoData) : base(ordem)
this.formatoData = formatoData;
public override ConverteValor ConverteValor
get { return (string valor, Type type) => (DateTime.ParseExact(valor, formatoData, null)); }
public int _numero { get; set; }
[DadoData(1, "dd-MM-yyyy")]
public DateTime _data { get; set; }
public string _palavra { get; set; }
public decimal _decimal { get; set; }
public static class FabricaObjeto
public static Objeto Constroi(string[] dadosOrdenados)
var typeAtributoDado = typeof(DadoAttribute);
(from propriedade in typeof(Objeto).GetProperties()
where Attribute.IsDefined(propriedade, typeAtributoDado)
((DadoAttribute)Attribute.GetCustomAttribute(propriedade, typeAtributoDado)).Ordem
Propriedade = propriedade,
ConverteValor = ((DadoAttribute)Attribute.GetCustomAttribute(propriedade, typeAtributoDado)).ConverteValor
var objeto = new Objeto();
foreach (var propriedade in propriedades)
propriedade.Propriedade.SetValue(objeto, propriedade.ConverteValor(dadosOrdenados[indiceValor], propriedade.Propriedade.PropertyType));