Puede evitar el uso de DynamicInvoke
que es muy lento. Puede utilizar la inferencia de tipo en C# para obtener una instancia genérica de su tipo anónimo. Algo así como:
public static Func<object[], T> AnonymousInstantiator<T>(T example)
{
var ctor = typeof(T).GetConstructors().First();
var paramExpr = Expression.Parameter(typeof(object[]));
return Expression.Lambda<Func<object[], T>>
(
Expression.New
(
ctor,
ctor.GetParameters().Select
(
(x, i) => Expression.Convert
(
Expression.ArrayIndex(paramExpr, Expression.Constant(i)),
x.ParameterType
)
)
), paramExpr).Compile();
}
Ahora se puede llamar,
var instantiator = AnonymousInstantiator(new { Name = default(string), Num = default(int) });
var a1 = instantiator(new object[] { "abc", 123 }); // strongly typed
var a2 = instantiator(new object[] { "xyz", 789 }); // strongly typed
// etc.
se puede utilizar el método de AnonymousInstantiator
para generar funciones para crear instancias de cualquier tipo anónimo con cualquier número de propiedades, al igual que usted tiene que pasar una adecuada ejemplo primero. Los parámetros de entrada deben pasarse como una matriz de objetos. Si te preocupa el rendimiento del boxeo allí, entonces debes escribir un instanciador personalizado que acepte solo string
y int
como parámetros de entrada, pero el uso de tal instanciador será un poco más limitado.
Posible dup de: http://stackoverflow.com/questions/606104/linq-expression-tree-question –
@Flash, esto no es posible, al menos no directamente. El compilador hace mucha "magia" cuando creas tipos anónimos: es azúcar sintáctica para declarar realmente una clase genuina de C# con un montón de propiedades. El compilador hace todo esto por ti. No existe un tipo de árbol de expresiones que realmente haga todo esto automáticamente. Si miras el enlace al que hice referencia, proporciona una solución alternativa. Sin embargo, usa Reflection.Emit, que no es para el fin del corazón. –
Kirk: El OP quiere * construir * una clase anónima, no * crear * una desde el principio. Siempre que sepa en tiempo de compilación cuáles son los nombres y tipos de las propiedades, puede hacer que el compilador cree el tipo para él y todo lo que tiene que hacer es encontrar la manera de resolverlo. – Gabe