Sen acı yavaş DynamicInvoke
kullanarak önleyebilirsiniz. Anonim tipinizi genel olarak örneklendirmek için C# cinsinden tür çıkarımını kullanabilirsiniz. Bir şey gibi:
Şimdi
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();
}
Arayabileceğin,
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.
Sen uygun bir geçmek zorunda sadece, özelliklerden herhangi birini sayı ile herhangi anonim tür örneğini fonksiyonlarını oluşturmak için AnonymousInstantiator
yöntemi kullanabilirsiniz önce örnek. Giriş parametreleri bir nesne dizisi olarak geçirilmelidir. Boks performansında endişe ederseniz, sadece string
ve int
kabul parametrelerini giriş parametreleri olarak kabul eden özel bir başlatıcı yazmanız gerekir, ancak böyle bir başlatıcının kullanımı biraz daha sınırlı olacaktır.
Olası kopyası: http://stackoverflow.com/questions/606104/linq-expression-tree-question –
@ Flash, bu mümkün değil, en azından doğrudan. Anonim, anonim tipler oluşturduğunuzda sizin için bir çok "sihir" yapar - gerçek bir C# sınıfını bir grup özellik ile bildirmek için sözdizimsel şekerdir. Derleyici tüm bunları sizin için yapar. Tüm bunları sizin için otomatik olarak yapan bir ifade ağacı türü yoktur. Başvurulan bağlantıya bakarsanız, bir geçici çözüm sağlar. Bununla birlikte, kalbin çekişi için olmayan Reflection.Emit'i kullanır. –
Kirk: OP, * anonim bir sınıf oluşturmak * ister * sıfırdan birini * oluşturmak * ister. Derleme zamanında, özelliklerin isimlerinin ve türlerinin ne olduğunu bildiği sürece, derleyiciyi onun için bir tür oluşturmasını sağlayabilir ve yapması gereken tek şey bunun nasıl örnek olacağıdır. – Gabe