using System;
using System.Linq;
using System.Linq.Expressions;
public class Test {
class Tst {
public int a;
public int b;
public int c;
}
public static Func<T,object[]> MakeFieldGetter<T>() {
var arg = Expression.Parameter(typeof(T), "arg");
var body = Expression.NewArrayInit(
typeof(object)
, typeof(T).GetFields().Select(f => (Expression)Expression.Convert(Expression.Field(arg, f), typeof(object)))
);
return (Func<T,object[]>)Expression
.Lambda(typeof(Func<T,object[]>), body, arg)
.Compile();
}
public static void Main() {
var tst1 = new Tst {a=1,b=2,c=3};
var tst2 = new Tst {a=5,b=7,c=9};
var getter = MakeFieldGetter<Tst>();
foreach (var f in getter(tst1)) {
Console.Write("{0} ", f);
}
Console.WriteLine();
foreach (var f in getter(tst2)) {
Console.Write("{0} ", f);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnM7CgpwdWJsaWMgY2xhc3MgVGVzdCB7CgpjbGFzcyBUc3QgewogICAgcHVibGljIGludCBhOwogICAgcHVibGljIGludCBiOwogICAgcHVibGljIGludCBjOwp9CgpwdWJsaWMgc3RhdGljIEZ1bmM8VCxvYmplY3RbXT4gTWFrZUZpZWxkR2V0dGVyPFQ+KCkgewogICAgdmFyIGFyZyA9IEV4cHJlc3Npb24uUGFyYW1ldGVyKHR5cGVvZihUKSwgImFyZyIpOwogICAgdmFyIGJvZHkgPSBFeHByZXNzaW9uLk5ld0FycmF5SW5pdCgKICAgICAgICB0eXBlb2Yob2JqZWN0KQogICAgLCAgIHR5cGVvZihUKS5HZXRGaWVsZHMoKS5TZWxlY3QoZiA9PiAoRXhwcmVzc2lvbilFeHByZXNzaW9uLkNvbnZlcnQoRXhwcmVzc2lvbi5GaWVsZChhcmcsIGYpLCB0eXBlb2Yob2JqZWN0KSkpCiAgICApOwogICAgcmV0dXJuIChGdW5jPFQsb2JqZWN0W10+KUV4cHJlc3Npb24KICAgICAgICAuTGFtYmRhKHR5cGVvZihGdW5jPFQsb2JqZWN0W10+KSwgYm9keSwgYXJnKQogICAgICAgIC5Db21waWxlKCk7Cn0KCnB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkgewogICAgdmFyIHRzdDEgPSBuZXcgVHN0IHthPTEsYj0yLGM9M307CiAgICB2YXIgdHN0MiA9IG5ldyBUc3Qge2E9NSxiPTcsYz05fTsKICAgIHZhciBnZXR0ZXIgPSBNYWtlRmllbGRHZXR0ZXI8VHN0PigpOwogICAgZm9yZWFjaCAodmFyIGYgaW4gZ2V0dGVyKHRzdDEpKSB7CiAgICAgICAgQ29uc29sZS5Xcml0ZSgiezB9ICIsIGYpOwogICAgfQogICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKICAgIGZvcmVhY2ggKHZhciBmIGluIGdldHRlcih0c3QyKSkgewogICAgICAgIENvbnNvbGUuV3JpdGUoInswfSAiLCBmKTsKICAgIH0gICAgICAgIAp9CgoKfQ==